根据我对相位相关的了解,该代码看起来是正确的。如果我正确理解你想要什么,那么你正在尝试使用相位相关来确定两个图像之间的偏移,因为它们的单应性只不过是水平和垂直偏移。事实上,您只能将偏移置于原点,这很可能是由于您的图像缺乏足够的高频信息来正确确定良好的偏移。
尝试使用这两个图像(这些图像来自您引用的维基百科文章,但我将它们提取出来并将它们保存为单独的图像):
当我使用您的 R 代码运行这两个图像时,我得到了我的相位相关图。请记住,您的图像实际上保存为.png
,所以我不得不将库更改为library(png)
我用过readPNG
代替readTIFF
。当您尝试使用上面的示例图像运行代码时,请记住这一点:
另外,最大峰值出现的位置是:
> shift
row col
[1,] 132 153
这告诉我们图像移动了 132 行和 153 列。请注意,这是相对于中心的图像。如果要确定实际偏移量,则需要减去垂直坐标的一半行和水平坐标的一半列。
因此,代码工作得很好......只是您的图像缺乏足够的高频信息来使相位相关工作。在这种情况下,相关性试图做的是我们试图找到每个图像之间的“相似”变化。如果每幅图像之间存在很多变化并且非常相似,那么相位相关将会很好地发挥作用。然而,如果我们没有那么多的变化,那么相位相关就不起作用。
为什么会这样?相位相关背后的基础是我们假设图像被高斯白噪声破坏,因此如果我们将白噪声与其自身相关(从一个图像到另一个图像),它将在偏移或偏移处给出一个非常好的峰值处处几乎为零。由于您的图像缺乏大量高频信息并且图像很干净,因此相位相关实际上不起作用。因此,有些人实际上建议的是预美白使图像包含白噪声,这样您就可以在我们正在讨论的偏移位置处获得漂亮的峰值。
然而,为了确保消除任何错误的最大值,最好在频域中平滑互相关矩阵(r
在你的 R 代码中),这样很有可能只有一个真正的最大值。在频域/FFT 域中使用高斯滤波器应该可以正常工作。
无论如何,我没有看到您的图像有太大变化,因此需要注意的是,您必须确保您的图像具有大量高频信息才能正常工作!