【问题标题】:Cross Correlation in numpy, with FFT - strange result?numpy中的互相关,带有FFT - 奇怪的结果?
【发布时间】:2015-11-03 12:02:38
【问题描述】:

我正在尝试使用 numpy 的 FFT 对两个图像进行互相关。

据我所知,我们有两个图像的互相关等于图像 A 的傅里叶变换的乘积的逆FFT,以及图像 B 的傅里叶变换的复共轭。

因此,我有以下代码:

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)

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

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)

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

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 更适合dsp.stackexchange.com
  • @MarkBorgerding 无论如何我可以明确地将它移到那里吗?还是我应该删除这个帖子并在那里重新发布?
  • 有没有可能你认为原点应该在中心,但图书馆认为原点应该在拐角处?例如您认为整数模 512 应该表示为 [-256, 255],但它表示它们为 [0,511]?
  • 您可能在这里找到了一个好点。如果第一个像素 [0,0] 表示与完全对齐的图像的相关性,那么 [0,511] 和 [511,0] 和 [511,511] 也是峰值是有意义的 - 因为图像几乎会再次对齐。我假设相关结果会“出现”,就好像像素 [0,0] 表示与原点 [-255,-255] 的图像 A 和原点 [0,0] 的图像 B 相关的图像,但它可以表示在 [0,0] 处与两者相关的图像(这在某种程度上更有意义)

标签: python opencv numpy signal-processing fft


【解决方案1】:

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

因此,FFTSHIFT 所做的一切都是以零频率分量为中心。主要用于可视化目的。您的原始结果在数学上是正确的,但轴只是没有在您预期的位置居中。

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多