numpy中的交叉相关,用FFT - 奇怪的结果?

时间:2015-11-03 12:02:39

标签: python opencv numpy signal-processing fft

我尝试使用numpy的FFT执行两个图像的互相关。

据我所知,我们认为两幅图像的互相关等于图像A的傅立叶变换与图像B的傅立叶变换的复共轭的逆FFT。

因此,我有以下代码:

img1 = cv2.imread("...jpg")
img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
fft1 = numpy.fft.fft2(img1)

# I'm cross correlating the same image with itself
fft2 = fft1.copy()           
fft2 = numpy.conj(fft2)

#Element wise multiplication
result = fft1*fft2           
result_img = numpy.fft.ifft2(result)
result_img = numpy.abs(result_img) #Remove complex values

#Following images are attached
image_shifted = normalize(numpy.fft.fftshift(result_img))
image_nonshifted = normalize(result_img)

但是,我的结果很奇怪。为了获得我认为的实际相关结果,我必须取消结果。以下是一些示例图片:

Image, not shifted, you can see bright parts at each corner

Image, shifted, looks much more like what an auto-correlation result should look like (centre point is maximal)

我不确定我的代码或预期数学是否错误,但我无法弄清楚发生了什么!

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

FFTSHIFT将零频率分量移到信号的中心。在这种情况下,信号是图像。一个好的视觉指南是this。如果展开原始输出图像,您将看到类似于此的内容:

enter image description here

所以FFTSHIFT所做的一切都是以零频率成分为中心。主要用于可视化目的。您的原始结果在数学上是正确的,但轴不在您预期的中心。