0

我正在做一个项目,其中有一个小模板(T)和一个图像(imin)。目的是使用沿 fft 的卷积来找到 imin 中最相似模式的位置。为此,我想在 C++ 中使用 FFTW 代码。但是,我是 C++ 新手,不知道我应该如何使用这个工具箱来实现这个目标。


谢谢保罗。实际上,我想将 FFT 用于我的 3D 案例,其中我有一个大的 3D 矩阵并希望与一个小的 3D 矩阵匹配。这就是我想使用 FFT 的原因。既然我应该尽快完成,你知道任何用于此目的的 C++ 代码吗?2D 和 3D(通过 FFT)。

4

2 回答 2

0

我相信除了上一篇文章中概述的步骤之外,您还必须确保在计算 FFT 之前移动内核,否则结果中会出现一半内核大小的位移。

于 2013-04-25T09:04:04.583 回答
0

与其使用 FFTW,不如考虑使用OpenCV,它通常是用于计算机视觉和图像处理的更高级别的 API,并且比从 FFT 等低级构建块构建自己的例程更容易使用。OpenCV 已经有一个模板匹配函数cvMatchTemplate,它可以在需要的地方“在后台”使用高效的 FFT 实现,因此性能应该不是问题。

如果您确实必须使用 FFTW,那么请准备好大量阅读文档和最初陡峭的学习曲线。互相关的步骤(我假设这是您要用于模板匹配的步骤)通常是:

  • 为更大的图像尺寸创建正向/反向 FFT 计划
  • 使用前向 FFT 计划对目标图像进行 FFT
  • 用零将模板图像填充到目标图像的大小
  • 使用前向 FFT 计划对填充模板图像进行 FFT
  • 采用填充图像模板 FFT 输出的复共轭
  • 将目标图像 FFT 输出乘以填充图像模板 FFT 输出的复共轭
  • 使用反向 FFT 计划对产品进行 IFFT

然后,您可以检查一个或多个峰值的结果,该峰值应对应于目标图像中模板图像的位置。

请注意,为了获得更好的结果,您应该考虑使用归一化互相关,但这在频域中实现起来相当复杂。

于 2012-07-27T08:06:45.217 回答