gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:52:21 25 4
gpt4 key购买 nike

我正在尝试使用来自 Wikipedia (http://en.wikipedia.org/wiki/Phase_correlation) 的配方在 R 中实现 2d 相位相关算法,以跟踪 2 张图像之间的移动。这些图像(帧)是用在风中晃动的相机拍摄的,最终目标是消除这些帧和后续帧中的晃动。两个示例图像和 R 代码如下:

frame 1 frame 2

## 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 方向上都有可见偏移或多个像素的后续帧,会发生这种情况。

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

干杯女孩和伙计们!

最佳答案

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

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

Image #1 Image #2

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

enter image description here

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

> shift
row col
[1,] 132 153

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

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

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

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

在任何情况下,我都没有看到您的图像有太大的变化,因此要从中消除的是,您必须确保您的图像具有大量高频信息才能正常工作!

关于r - 在 R 中使用 fft 执行相位相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30630632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com