我尝试使用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
我不确定我的代码或预期数学是否错误,但我无法弄清楚发生了什么!
非常感谢任何帮助,谢谢。
答案 0 :(得分:0)
FFTSHIFT将零频率分量移到信号的中心。在这种情况下,信号是图像。一个好的视觉指南是this。如果展开原始输出图像,您将看到类似于此的内容:
所以FFTSHIFT所做的一切都是以零频率成分为中心。主要用于可视化目的。您的原始结果在数学上是正确的,但轴不在您预期的中心。