对不起,如果这个问题太简单了,但是我是图像处理的新手,在成功编写了两个程序,一个卷积程序和一个低通滤波程序后,我注意到对于大致相同的输出,低通滤波方法需要 4 倍时间!
让我们假设图像是一个正方形的边N。在卷积时,我们可以使用一个任意小的内核(例如到)并在其中放入一个高斯,比如 size =。然后我们必须简单地将图像和内核填充到一个边方数组中并在它上面运行 DFT,乘以它并运行 IDFT。MN+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)