Ale*_*sil 3 r fft image-processing cross-correlation
我正在尝试使用来自维基百科(http://en.wikipedia.org/wiki/Phase_correlation)的配方在R中实现二维相位相关算法,以便跟踪两幅图像之间的移动.这些图像(帧)是在风中摇动的相机拍摄的,最终目标是去除这些和后续帧中的抖动.下面是两个示例图像和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)
Run Code Online (Sandbox Code Playgroud)
根据我的理解,矢量偏移应该包含最佳校正这两个图像的传递位移(dx和dy)的信息.然而,移位变量给出dx = 1和dy = 1,我假设它表示在x或y方向上没有移位.对于在x和y方向上都存在可见移位或多个像素的后续帧,会发生这种情况.
你们中的任何一个人在我的代码/公式中都会看到错误吗?或者,在进行相位相关之前,我是否需要尝试更先发现象,如过滤图像?
干杯加尔斯和伙计们!
根据我对相位相关的了解,代码看起来是正确的.如果我理解你想要的正确,你试图使用相位相关来确定两个图像之间的偏移,因为它们的单应性只不过是水平和垂直偏移.事实上,您只是将转换置于原点,这很可能是因为您的图像缺乏足够的高频信息才能正确确定良好的转换.
请尝试这两个图像(这些图片来自您引用的维基百科文章,但我将它们解析出来并将它们保存为单独的图像):

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

此外,发生最大峰值的位置是:
> shift
row col
[1,] 132 153
Run Code Online (Sandbox Code Playgroud)
这告诉我们图像移过132行和153列.请注意,这是关于图像的中心.如果要确定实际偏移量,则需要将此值减去垂直坐标的一半行和水平坐标的一半列.
因此,代码完全正常......只是你的图像缺乏足够的高频信息才能使相位相关工作.在这种情况下,尝试做的相关性是我们试图在每个图像之间找到"相似"的变化.如果每个图像之间存在很多差异并且非常相似,则相位相关将很好地工作.但是,如果我们没有那么多变化,那么相位相关将不起作用.
为什么会这样?相位相关背后的基础是我们假设图像被高斯白噪声破坏,因此如果我们将白噪声与其自身(从一个图像到另一个图像)相关联,它将在偏移或偏移处给出非常好的高峰值.到处都是,几乎为零.由于您的图像缺少大量高频信息以及图像清晰的事实,因此相位相关实际上不起作用.因此,有些人实际建议的是预先对图像进行白化,使图像包含白噪声,这样您就可以在我们正在讨论的偏移量处得到漂亮的峰值.
但是,为了确保消除任何虚假的最大值,最好还要对频域中的互相关矩阵进行平滑处理(r在R代码中),这样才有可能只有一个真值最大值.在频率/ FFT域中使用高斯滤波器应该可以正常工作.
在任何情况下,我都没有看到你的图像有太大的变化,所以要避免这种情况,你必须确保你的图像有很多高频信息才能使用!