我的任务是将大小为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 = 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()
答案 0 :(得分:0)
我看到medfilt的这个定义:
Signature: sg.medfilt(volume, kernel_size=None) Docstring: Perform a median filter on an N-dimensional array. Apply a median filter to the input array using a local window-size given by `kernel_size`. Parameters ---------- volume : array_like An N-dimensional input array. kernel_size : array_like, optional A scalar or an N-length list giving the size of the median filter window in each dimension. Elements of `kernel_size` should be odd. If `kernel_size` is a scalar, then this scalar is used as the size in each dimension. Default size is 3 for each dimension. ....
你试过这个吗?
sg.medfilt(w1data,kernel_size=50)
答案 1 :(得分:0)
基于the docs我认为您需要改变的是
# 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)
......这对你有用吗?
答案 2 :(得分:0)
您问题中的关键是内核的甚至 -sizedness。 scipy.signal.medfilt
限制您使用奇数大小的内核。在网上搜索,你会发现很多关于为什么内核通常是奇数的信息。我认为,主要原因是中心。
例如,如果你将包含高斯的图像卷入一个偶数大小的高斯内核 - 你将最终得到一个带有高斯的图像,该图像与原始图像相比具有偏移(1/2像素)的中心,而不是卷积,形象。
具体地说,对于中值滤波器,还有另外一个原因可以考虑奇数大小的内核:具有奇数个像素产生唯一的中值,而具有偶数个像素将需要决定,例如,要使用的像素:pixel[int(size/2)]
,pixel[int(size/2)+1]
或两者的平均值。
您不能将scipy.signal.medfilt
用于偶数内核。但是,您始终可以编写一个循环来遍历输入图像的所有像素,并在每个像素“周围”提取一个偶数大小的窗口,然后计算该窗口中像素的中值。我引用“around”因为它不清楚(=唯一)如何将该窗口置于像素上:由您决定。