在 R 中使用 fft 执行相位相关

2024-01-24

我正在尝试使用维基百科中的食谱在 R 中实现二维相位相关算法(http://en.wikipedia.org/wiki/Phase_correlation http://en.wikipedia.org/wiki/Phase_correlation)以跟踪两个图像之间的运动。这些图像(帧)是用在风中晃动的相机拍摄的,最终目标是消除这些帧和后续帧中的抖动。两个示例图像和 R 代码如下:

## we will need the tiff library 
library(tiff)

## read in the tiff files 
f1=as.matrix(readTIFF('f1.tiff',native=TRUE))
f2=as.matrix(readTIFF('f2.tiff',native=TRUE))

## take the fft of the first  frame
F1 <- fft(f1)
## take the Conjugate fft of the second frame
F2.c <- Conj(fft(f2))

## calculate the cross power spectrum according to the wiki article
R <- (F1*F2.c)/abs(F1*F2.c)
## take the inverse fft of R
r <- fft(R,inv=TRUE)/length(R)
## because the zero valued imaginary numbers are not needed
r <- Re(r)

## show the normalized cross-correlation
image(r)

## find the max in the cross correlation matrix, or the phase shift -
## between the two images
shift <- which(r==max(r),arr.ind=TRUE)

向量shift根据我的理解,应该包含有关最能校正这两个图像的传递移位(dx 和 dy)的信息。然而,移位变量给出 dx=1 和 dy=1,我认为这表明 x 或 y 方向上没有移位。这种情况发生在后续帧中,其中 x 和 y 方向上都有可见的移位或多个像素。

你们都看到我的代码/公式中有错误吗?或者我是否需要尝试一些更奇特的方法,例如在进行相位相关之前先过滤图像?

干杯女孩们和男孩们!


根据我对相位相关的了解,该代码看起来是正确的。如果我正确理解你想要什么,那么你正在尝试使用相位相关来确定两个图像之间的偏移,因为它们的单应性只不过是水平和垂直偏移。事实上,您只能将偏移置于原点,这很可能是由于您的图像缺乏足够的高频信息来正确确定良好的偏移。

尝试使用这两个图像(这些图像来自您引用的维基百科文章,但我将它们提取出来并将它们保存为单独的图像):

当我使用您的 R 代码运行这两个图像时,我得到了我的相位相关图。请记住,您的图像实际上保存为.png,所以我不得不将库更改为library(png)我用过readPNG代替readTIFF。当您尝试使用上面的示例图像运行代码时,请记住这一点:

另外,最大峰值出现的位置是:

> shift
     row col
[1,] 132 153

这告诉我们图像移动了 132 行和 153 列。请注意,这是相对于中心的图像。如果要确定实际偏移量,则需要减去垂直坐标的一半行和水平坐标的一半列。

因此,代码工作得很好......只是您的图像缺乏足够的高频信息来使相位相关工作。在这种情况下,相关性试图做的是我们试图找到每个图像之间的“相似”变化。如果每幅图像之间存在很多变化并且非常相似,那么相位相关将会很好地发挥作用。然而,如果我们没有那么多的变化,那么相位相关就不起作用。

为什么会这样?相位相关背后的基础是我们假设图像被高斯白噪声破坏,因此如果我们将白噪声与其自身相关(从一个图像到另一个图像),它将在偏移或偏移处给出一个非常好的峰值处处几乎为零。由于您的图像缺乏大量高频信息并且图像很干净,因此相位相关实际上不起作用。因此,有些人实际上建议的是预美白使图像包含白噪声,这样您就可以在我们正在讨论的偏移位置处获得漂亮的峰值。

然而,为了确保消除任何错误的最大值,最好在频域中平滑互相关矩阵(r在你的 R 代码中),这样很有可能只有一个真正的最大值。在频域/FFT 域中使用高斯滤波器应该可以正常工作。

无论如何,我没有看到您的图像有太大变化,因此需要注意的是,您必须确保您的图像具有大量高频信息才能正常工作!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R 中使用 fft 执行相位相关 的相关文章

随机推荐