我有一个使用常规卷积的当前高斯模糊实现。它对于小内核来说足够高效,但是一旦内核大小变大一点,性能就会受到影响。所以,我正在考虑使用 FFT 实现卷积。我从来没有任何与 FFT 相关的图像处理的经验,所以我有几个问题。
基于 2D FFT 的卷积是否也可以分成两个 1D 卷积?
- 如果是真的,它是这样的吗 - 每行的 1D FFT,然后每列的 1D FFT,然后乘以 2D 内核,然后每列的逆变换和每行的逆变换?或者我是否必须在每次一维 FFT 变换后乘以一维内核?
现在我明白内核大小应该与图像大小相同(一维的情况下为行)。但它将如何影响边缘?我必须用零填充图像边缘吗?如果是这样,内核大小应该等于填充之前或之后的图像大小?
另外,这是一个 C++ 项目,我打算使用 KissFFT,因为这是一个商业项目。欢迎您提出任何更好的替代方案。谢谢你。
编辑:感谢您的回复,但我还有一些问题。
我看到输入图像的虚部将全为零。但是输出虚部也会为零吗?我是否必须将高斯核乘以实部和虚部?
我有相同图像的实例以不同的比例模糊,即相同的图像被缩放到不同的大小并在不同的内核大小下模糊。每次缩放图像时都必须执行 FFT,还是可以使用相同的 FFT?
最后,如果我想可视化 FFT,我知道必须将日志过滤器应用于 FFT。但是我真的迷失了应该使用哪个部分来可视化 FFT?实部或虚部。
同样对于大小为 512x512 的图像,实部和虚部的大小是多少。它们的长度会一样吗?
再次感谢您的详细回复。