我实现了一种使用高斯这样模糊图像的方法:
- 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)
结果在边缘包含一些别名。
结果如下:
如果你注意到右边的图像,你会发现它在两个维度都有别名。
上述算法是否正确?
实现是使用C ++和fftw3。
答案 0 :(得分:0)
您的上述算法是正确的,有轻微的空洞。
当您使用0填充图像时,这些零实际上用于卷积。在FFT空间中,这将在图像边缘周围添加巨大的高频组件。在非FFT空间中,这意味着,在边缘上最多1个内核大小,0被卷入,这将在边缘给你奇怪的结果。人们通常以两种方式处理这个问题:
为了获得最佳效果,我经常同时进行1和2(以获得实际图像并消除傅里叶空间中的高频边缘)。