我想在 512x512 像素的图像上应用尺寸为 5x5 像素的高斯滤波器。我找到了一个 scipy 函数来做到这一点:
scipy.ndimage.filters.gaussian_filter(input, sigma, truncate=3.0)
我如何选择 sigma 的参数以确保我的高斯窗口为 5x5 像素?
最佳答案
在此处查看源代码: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。右侧为 2,如果
2 <= 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
关于image-processing - scipy中的高斯滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25216382/