在Python中应用偶数中值滤波器
我的任务是对图像应用大小为50x50像素的中值滤波器。我知道如何应用过滤器,但当过滤器为偶数时,如何指定过滤器的大小?我的代码如下在Python中应用偶数中值滤波器,python,filtering,median,Python,Filtering,Median,我的任务是对图像应用大小为50x50像素的中值滤波器。我知道如何应用过滤器,但当过滤器为偶数时,如何指定过滤器的大小?我的代码如下 import matplotlib.pyplot as plt from astropy.io import fits import scipy.signal as sg # Open data files hdulist = fits.open('xbulge-w1.fits') w1data = hdulist[0].data hdulist2 = fi
import matplotlib.pyplot as plt
from astropy.io import fits
import scipy.signal as sg
# Open data files
hdulist = fits.open('xbulge-w1.fits')
w1data = hdulist[0].data
hdulist2 = fits.open('xbulge-w2.fits')
w2data = hdulist2[0].data
# Apply median filter to each image
w1_med = sg.medfilt(w1data)
w2_med = sg.medfilt(w2data)
# Set maximum sampled galactic lat (b) and long (l)
l_max = 15
b_max = 15
# Plot median filtered images, rescaled to galactic coordinates
plt.subplot2grid((2,1), (0,0))
plt.imshow(w1_med, origin='lower',
extent=[l_max, -l_max, -b_max, b_max],
cmap = 'gray')
plt.title('W1 median filter')
plt.subplot2grid((2, 1), (1,0))
plt.imshow(w2_med, origin='lower',
extent=[l_max, -l_max, -b_max, b_max],
cmap = 'gray')
plt.title('W2 median filter')
plt.tight_layout()
plt.show()
[编辑]很抱歉我之前的回答中存在误解。中值滤波是一种噪声抑制技术。结果取决于内核维度,它通常是一个小奇数,例如3,5,7。内核大小将给出应用中值的维度。例如,对于大小为3的方形内核,该算法执行下图所示的操作 因此,我建议你在你的身材大小上单独尝试一些不同的内核,例如3,5,几乎。然后选择一个结果最好的。这将取决于你的数字
sg.medfilt(w1data,kernel_size=5)
此外,我看到了medfilt的以下定义:
请注意,数组将自动进行零填充。这是修复大小均匀的图像所必需的,因为我认为您需要更改的只是
# Apply median filter to each image
w1_med = sg.medfilt(w1data)
w2_med = sg.medfilt(w2data)
到
…这对您有用吗?您的问题的关键是内核的均匀大小。scipy.signal.medfilt限制您使用奇数大小的内核。在网上搜索一下,你会发现很多关于为什么内核通常是奇数大小的信息。我认为,主要原因是居中 例如,如果将包含高斯核的图像与均匀大小的高斯核进行卷积,则最终得到的图像与原始图像(未卷积)相比中心偏移了1/2像素
关于中值滤波器,有一个额外的原因,为什么人们可以考虑奇数的内核:奇数的像素产生唯一的中值,而偶数的像素需要决定,例如,在哪个像素上使用结果:像素[ItStime/2 ],像素[ItStime/ 2+1 ],或者两者的平均值。
即使是sezed内核,也不能使用scipy.signal.medfilt。但是,您始终可以编写一个循环,遍历输入图像的所有像素,并在每个像素周围提取一个大小均匀的窗口,然后计算该窗口中像素的中值。我引用这句话是因为不清楚如何将窗口集中在像素上:这将取决于您做出决定 我在文档中看到了这一点,但它也指出kernel_size参数必须是奇数。我确实想知道是否将kernel_size=49考虑到Python从零开始的索引规则,但与默认值3相比,这似乎是巨大的。根据您对答案的评论,我认为强调内核的均匀大小很重要。
# Apply median filter to each image
w1_med = sg.medfilt(w1data)
w2_med = sg.medfilt(w2data)
# Apply median filter to each image
w1_med = sg.medfilt(w1data, kernel_size=50)
w2_med = sg.medfilt(w2data, kernel_size=50)