使用fft的高斯模糊

时间:2014-12-10 15:09:16

标签: c++ image-processing signal-processing

我实现了一种使用高斯这样模糊图像的方法:

- image I , size = WxH
- kernel K , size = MxM
- padded the kernel PD to the size of the image
  i.e for an image 5x5 and a kernel 3x3 after padding the kernel looks like:
    0 0 0 0 0
    0 x x x 0
    0 x x x 0
    0 x x x 0
    0 0 0 0 0 
where X is the value from the original kernel
- performed 2d fft on the padded kernel PD (FFT_K)
- performed 2d fft on the image I (FFT_I)
- multiplied FFT_I * FFT_K (FFT_RES)
- perfomed fft on FFT_RES
- shifted the FFT_RES (RESULT)

结果在边缘包含一些别名。

结果如下:

enter image description here

如果你注意到右边的图像,你会发现它在两个维度都有别名。

上述算法是否正确?

实现是使用C ++和fftw3。

1 个答案:

答案 0 :(得分:0)

您的上述算法是正确的,有轻微的空洞。

当您使用0填充图像时,这些零实际上用于卷积。在FFT空间中,这将在图像边缘周围添加巨大的高频组件。在非FFT空间中,这意味着,在边缘上最多1个内核大小,0被卷入,这将在边缘给你奇怪的结果。人们通常以两种方式处理这个问题:

  1. 卷积后,只需在图像周围抛出1个内核大小的边框。
  2. 将边缘镜像到垫中,而不是用零填充。
  3. 为了获得最佳效果,我经常同时进行1和2(以获得实际图像并消除傅里叶空间中的高频边缘)。