python中的圆形中值滤波器
问题描述:
我想创建一个给定半径的圆形中值滤波器,而不是数组中的方形滤波器。 这里是我的尝试至今:python中的圆形中值滤波器
# Apply median filter to each image
import matplotlib.pyplot as plt
radius = 25
disk_filter = plt.fspecial('disk', radius)
w1_median_disk = plt.imfilter(w1data, disk_filter, 'replicate')
w2_median_disk = plt.imfilter(w2data, disk_filter, 'replicate')
w1data
和w2data
是我想要的过滤器适用于2-d numpy的阵列。 fspecial
模块来自Matlab,但我想在我的Python代码中使用它(或其他类似的东西)。有任何想法吗?
我得到错误信息“
disk_filter = plt.fspecial('disk', radius)
AttributeError: 'module' object has no attribute 'fspecial'"
我想知道,如果有任何一个模块,我可以导入包含fspecial,或在Python等效的命令。
答
刮‘摄影师’从图像:
https://www.mathworks.com/help/images/ref/fspecial.html
import numpy as np
import matplotlib.pyplot as plt
import os
from scipy import misc
path = 'D:/My Pictures/cameraman.bmp'
cameraman = misc.imread(path, flatten=0)
cameraman = np.average(cameraman, axis=2)
r = 10
y,x = np.ogrid[-r: r+1, -r: r+1]
disk = x**2+y**2 <= r**2
disk = disk.astype(float)
from scipy import signal
blur = signal.convolve2d(cameraman, disk, mode='full', boundary='fill', fillvalue=0)
import matplotlib
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(cameraman, cmap = matplotlib.cm.Greys_r)
ax1.set_title('cameraman')
ax2.imshow(blur, cmap = matplotlib.cm.Greys_r)
ax2.set_title('signal.convolve2d(cameraman, disk..')
,或者您可能需要使用scipy.ndimage.filters.convolve其“反映”边缘处理
from scipy.ndimage.filters import convolve
blur = convolve(cameraman, disk)
答
如果你愿意安装/使用额外的包,我强烈推荐惊人skimage在Python中任何一种的图像处理!与圆盘状的过滤器过滤只是两行代码:
import skimage
import skimage.data
import skimage.morphology
import skimage.filters
# load example image
original = skimage.data.camera()
# create disk-like filter footprint with given radius
radius = 10
circle = skimage.morphology.disk(radius)
# apply median filter with given footprint = structuring element = selem
filtered = skimage.filters.median(original, selem = circle)
答
这里的东西我发现,似乎做的工作:
from scipy.ndimage.filters import generic_filter as gf
# Define physical shape of filter mask
def circular_filter(image_data, radius):
kernel = np.zeros((2*radius+1, 2*radius+1))
y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask = x**2 + y**2 <= radius**2
kernel[mask] = 1
filtered_image = gf(image_data, np.median, footprint = kernel)
return filtered_image
但我不知道我完全理解这是怎么回事上。特别是,究竟什么行
y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask = x**2 + y**2 <= radius**2
kernel[mask] = 1
呢?
这段代码有什么问题? – Julien
编辑原始帖子以澄清错误。 – Jim421616