scipy中的高斯滤波器

use*_*620 18 image-processing gaussian scipy

我想在512x512像素的图像上应用尺寸为5x5像素的高斯滤镜.我找到了一个scipy函数来做到这一点:

scipy.ndimage.filters.gaussian_filter(input, sigma, truncate=3.0)
Run Code Online (Sandbox Code Playgroud)

我如何选择西格玛参数以确保我的高斯窗口是5x5像素?

War*_*ser 24

在这里查看源代码: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
Run Code Online (Sandbox Code Playgroud)

所以

(w - 1)/2 = int(truncate*sigma + 0.5)
Run Code Online (Sandbox Code Playgroud)

对于w = 5,左侧是2.如果是,则右侧是2

2 <= truncate*sigma + 0.5 < 3
Run Code Online (Sandbox Code Playgroud)

要么

1.5 <= truncate*sigma < 2.5
Run Code Online (Sandbox Code Playgroud)

如果你选择truncate = 3(覆盖默认值4),你会得到

0.5 <= sigma < 0.83333...
Run Code Online (Sandbox Code Playgroud)

我们可以通过过滤一个全0的输入来检查这个,除了单个1(即找到滤波器的脉冲响应)并计算滤波输出中的非零值的数量.(以下npnumpy.)

首先使用单个1创建输入:

In [248]: x = np.zeros(9)

In [249]: x[4] = 1
Run Code Online (Sandbox Code Playgroud)

检查大小的变化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
Run Code Online (Sandbox Code Playgroud)

......在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
Run Code Online (Sandbox Code Playgroud)


小智 7

遵循先前的出色回答:

  1. 设置西格玛 s = 2
  2. 设定视窗大小 w = 5
  3. 评估“截断”值: t = (((w - 1)/2)-0.5)/s
  4. 过滤: filtered_data = scipy.ndimage.filters.gaussian_filter(data, sigma=s, truncate=t)