【问题标题】:Gaussian filter in scipyscipy中的高斯滤波器
【发布时间】:2014-10-02 16:39:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: image-processing scipy gaussian


    【解决方案1】:

    在此处查看源代码: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
    

    【讨论】:

    • 您的答案与此问题的答案不同:link 因此我问了另一个问题。也许您可以为我澄清什么是对的,什么是错的? My question:
    • 请注意:sigma 为 0.5 的高斯在采样时会导致很大程度的混叠。采样内核不再类似于高斯。适当的高斯滤波需要更大的值。 1.0 的 sigma 导致 1% 的内核功率被混叠。因此,根据您对精度的容忍度,您也可以接受稍微小一点的高斯,可能会降低到 0.8 左右,但降低到它不再有意义。
    【解决方案2】:

    按照之前的优秀答案:

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2013-03-29
      • 2023-04-09
      • 2018-01-26
      • 2013-02-01
      相关资源
      最近更新 更多