我想在512x512像素的图像上应用尺寸为5x5像素的高斯滤镜。我发现了一个scipy功能:
scipy.ndimage.filters.gaussian_filter(input, sigma, truncate=3.0)
如何选择sigma参数以确保我的高斯窗口为5x5像素?
答案 0 :(得分:22)
在此处查看源代码:https://github.com/scipy/scipy/blob/master/scipy/ndimage/filters.py
您会看到gaussian_filter
为每个轴调用gaussian_filter1d
。在gaussian_filter1d
中,过滤器的宽度由sigma
和truncate
的值隐式确定。实际上,宽度w
是
w = 2*int(truncate*sigma + 0.5) + 1
所以
(w - 1)/2 = int(truncate*sigma + 0.5)
对于w = 5,左侧为2.如果
,则右侧为22 <= truncate*sigma + 0.5 < 3
或
1.5 <= truncate*sigma < 2.5
如果您选择truncate = 3
(覆盖默认值4),则会获得
0.5 <= sigma < 0.83333...
我们可以通过过滤除了单个1之外全部为0的输入(即找到滤波器的脉冲响应)并计算滤波输出中非零值的数量来检查这一点。 (在下文中,np
为numpy
。)
首先使用单个1:
创建输入In [248]: x = np.zeros(9)
In [249]: x[4] = 1
检查sigma = 0.5
...
In [250]: np.count_nonzero(gaussian_filter1d(x, 0.49, truncate=3))
Out[250]: 3
In [251]: np.count_nonzero(gaussian_filter1d(x, 0.5, truncate=3))
Out[251]: 5
......并在sigma = 0.8333...
:
In [252]: np.count_nonzero(gaussian_filter1d(x, 0.8333, truncate=3))
Out[252]: 5
In [253]: np.count_nonzero(gaussian_filter1d(x, 0.8334, truncate=3))
Out[253]: 7
答案 1 :(得分:4)
s = 2
w = 5
t = (((w - 1)/2)-0.5)/s
filtered_data = scipy.ndimage.filters.gaussian_filter(data, sigma=s, truncate=t)