Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中应用偶数中值滤波器_Python_Filtering_Median - Fatal编程技术网

在Python中应用偶数中值滤波器

在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

我的任务是对图像应用大小为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,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)