如何使用fftw包编写计算模板(T)和二维图像(亚胺)之间二维卷积的函数



我正在做一个项目,其中我有一个小模板(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之前移动内核,否则结果中会有一半内核大小的位移。

最新更新