scipy中的高斯滤波器

时间:2014-08-09 07:42:55

标签: image-processing scipy gaussian

我想在512x512像素的图像上应用尺寸为5x5像素的高斯滤镜。我发现了一个scipy功能:

scipy.ndimage.filters.gaussian_filter(input, sigma, truncate=3.0)

如何选择sigma参数以确保我的高斯窗口为5x5像素?

2 个答案:

答案 0 :(得分:22)

在此处查看源代码:https://github.com/scipy/scipy/blob/master/scipy/ndimage/filters.py

您会看到gaussian_filter为每个轴调用gaussian_filter1d。在gaussian_filter1d中,过滤器的宽度由sigmatruncate的值隐式确定。实际上,宽度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的输入(即找到滤波器的脉冲响应)并计算滤波输出中非零值的数量来检查这一点。 (在下文中,npnumpy。)

首先使用单个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)

按照之前的优秀答案:

  1. 设置sigma s = 2
  2. 设置窗口大小w = 5
  3. 评估'truncate'值:t = (((w - 1)/2)-0.5)/s
  4. 过滤:filtered_data = scipy.ndimage.filters.gaussian_filter(data, sigma=s, truncate=t)