在Python中应用偶数大小的中值滤波器

时间:2017-07-26 02:49:01

标签: 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 = 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 个答案:

答案 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”因为它不清楚(=唯一)如何将该窗口置于像素上:由您决定。