当我们可以与高斯核卷积时,为什么要使用高斯低通滤波器

信息处理 图像处理 fft 卷积 低通滤波器
2022-02-03 22:21:30

对不起,如果这个问题太简单了,但是我是图像处理的新手,在成功编写了两个程序,一个卷积程序和一个低通滤波程序后,我注意到对于大致相同的输出,低通滤波方法需要 4 倍时间!

让我们假设图像是一个正方形的边N在卷积时,我们可以使用一个任意小的内核(例如到)并在其中放入一个高斯,比如 size =然后我们必须简单地将图像和内核填充到一个边方数组中并在它上面运行 DFT,乘以它并运行 IDFT。3σM3σN+M-1

但是对于低通滤波,我们必须创建一个宽度为填充的方形数组2*N需要少一个 DFT,但是一个 DFT 和 4 倍元素的阵列上的 IDFT 将花费明显更长的时间,因为填充的阵列很大(以 Gonzalez&Woods 图 4.36 为例)!既然高斯核的 DFT 也是高斯的,那我们为什么要使用高斯低通滤波呢?它需要将近 4 倍的时间(看下面)?

源代码:我已经把源代码放在了 github 上

我在我的程序中添加了一些时间来说明我的意思。图像为 233*233 像素。CPU的主频为 3.07GHz。

对于低通滤波器,请注意 FFT 和 IFFT 是在大小为 466*466 的数组上完成的:

Gaussian low pass filter timing:

Padding:                0.002564 (seconds)
FFT:                    0.018210 (seconds)
Applying filter:        0.006686 (seconds)
IFFT:                   0.017254 (seconds)
Time for final step:    0.000550 (seconds)

Total:                  0.047424 (seconds)

对于具有大小为 9*9 的内核的相同图像的卷积,请注意三个 FFT 和 IFFT 是在大小为 241*241 的数组上完成的:

Gaussian convolution timing:

Making the kernel:      0.000077 (seconds)
Pad both to same size:  0.001389 (seconds)
Padded image FFT:       0.002699 (seconds)
Padded kernel FFT:      0.001866 (seconds)
Multiplying:            0.000384 (seconds)
IFFT:                   0.002241 (seconds)
Crop from padded:       0.000574 (seconds)

Total:          0.011149 (seconds)
1个回答

在实践中,高斯低通滤波器是使用 FIR 或 IIR 滤波器编写的,首先滤波器在每条水平线上从左到右运行,然后滤波器在每条垂直线上向上运行然后向下运行。它比做 FFT 和 IFFT 便宜得多。

您的两个操作没有执行相同的操作。边缘周围的过滤效果将非常不同。你正在做一个循环卷积。对于离散傅里叶变换,卷积定理说傅里叶变换的乘法相当于在平面上无限重复/平铺图像的卷积。因此,在左边缘附近,例如,您将图片右侧的一些组件模糊在一起。(例如,尝试在左半边为黑色,右半边为白色的图片上执行您的操作。)

您的“低通”过滤器正在填充图像和内核以尝试减少一些边缘效应。它更昂贵,但它更接近于你将高斯与图像进行“真实”卷积时得到的结果。

在您的应用程序中,从图像另一侧模糊数据的循环卷积效果可能没问题,但在许多应用程序中这是不可接受的。

至于图像的 FFT 快 10 倍的原因。2d FFT 是通过对每条水平线进行 1d FFT,然后对每条垂直线进行 1d FFT 来完成的。因此,在的情况下,您正在执行 1-d FFT,每个 FFT 需要总共的情况下,您正在执行 1-d FFT,每个 FFT 需要总共(略多于)为更大的图像添加缓存效果,并且慢 10 倍似乎很合理。N×N2N×2NN×N2NO(NlogN)O(2N2logN)2N×2N4NO(2Nlog2N)O(8N2logN)