我正在做一个项目,其中我有一个小模板(T)和一个图像(亚胺)。目的是使用卷积和fft来找到亚胺中最相似模式的位置。我想在C++中使用FFTW代码来达到这个目的。但是,我是C++的新手,不知道该如何使用这个工具箱来实现这个目标。
谢谢保罗。事实上,我想在我的3D情况下使用FFT,在这种情况下,我有一个大的3D矩阵,并想与一个小的3D矩阵匹配。这就是为什么我想使用FFT。既然我很快就会这么做,你知道有什么C++代码可以实现这个目标吗?2D和3D(通过FFT)。
您可能不想使用FFTW,而是考虑使用OpenCV,这是一种用于计算机视觉和图像处理的更高级别的API,并且比使用FFT等低级别构建块构建自己的例程更容易使用。OpenCV已经有了一个模板匹配函数cvMatchTemplate,它可以在需要的地方"在引擎盖下"使用高效的FFT实现,因此性能应该不会成为问题。
如果你真的必须使用FFTW,那么就要为大量阅读文档和最初陡峭的学习曲线做好准备。交叉关联的步骤(我假设这是您想要用于模板匹配的步骤)通常是:
- 为较大的图像大小创建正向/反向FFT计划
- 使用前向FFT方案对目标图像进行FFT
- 将模板图像填充到目标图像的大小(零)
- 使用前向FFT方案对填充模板图像进行FFT
- 取填充图像模板FFT输出的复共轭
- 将目标图像FFT输出乘以填充图像模板FFT输出的复共轭
- 使用反向FFT计划对产品进行IFFT
然后,您可以检查一个或多个峰值的结果,这些峰值应与模板图像在目标图像中的位置相对应。
请注意,为了获得更好的结果,您应该考虑使用归一化互相关,但这在频域中实现起来相当复杂。
我相信,除了上一篇文章中概述的步骤外,您还必须确保在计算FFT之前移动内核,否则结果中会有一半内核大小的位移。