我目前有一个使用常规卷积实现的高斯模糊。对于小核,它是足够高效的,但一旦核的大小变大,性能就会下降。因此,我考虑使用FFT来实现卷积。我以前没有任何FFT相关的图像处理经验,所以我有几个问题。
2D FFT卷积是否也可分成两个1D卷积?
- 如果是,是这样进行的吗 - 对每行进行1D FFT,然后对每列进行1D FFT,再与2D内核相乘,然后对每列进行逆变换和每行的逆变换?还是每个1D FFT变换后都要乘以一个1D内核?
现在我明白内核大小应该与图像大小相同(在1D情况下为行)。但这会如何影响边缘?我必须用零填充图像边缘吗?如果是,那么内核大小应该在填充之前或之后与图像大小相同吗?
另外,这是一个C++项目,我计划使用kissFFT,因为这是一个商业项目。如果你有更好的替代方案,请提出建议。谢谢。
编辑:感谢回复,但我还有几个问题。
我看到输入图像的虚部将全部为零。但输出虚部也会为零吗?我必须将高斯内核乘以实部和虚部吗?
我需要对不同尺度的相同图像进行模糊处理,即将相同的图像缩放到不同的尺寸并使用不同的核大小进行模糊处理。每次缩放图像时,我必须进行FFT操作吗?还是可以使用相同的FFT?
最后,如果我想要可视化FFT,我理解必须应用对数滤波器来进行FFT。但是我真的不知道应该使用哪一部分来可视化FFT?实部还是虚部。
另外,对于512x512的图像,实部和虚部的大小将是多少?它们的长度将相同吗?
再次感谢您详细的回复。