图像的交叉相关

时间:2018-04-18 15:53:11

标签: c# fft correlation complex-numbers

我使用Accord Framework来实现两个图像之间的互相关。我的目标是找出第二张图像与第一张图像相比移位了多少(多少像素,以及在哪个方向上)。

我使用的基本公式如下:

  • corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros)))

我将整个代码放在我的消息的末尾,一切都发生在Click事件上。我的初始图像存储在1024 * 768位图中。所以这是我采取的步骤:

  1. 我将2张图片裁剪为对我有用的4个区域(ExpInit, ExpFinal, RefInit, RefFinal),我想逐两关联(ExpInitExpFinal和{{1}与RefInit)。这些裁剪的图像尺寸为1024 * 131。
  2. 我将这些裁剪的图像放在新位图的中心,尺寸为2 ^ n(2048 * 512)。
  3. 应用RefFinal过滤器获取Grayscaling
  4. 将每个图像转换为8bppIndexed PixelFormat格式,并在4个图像上应用正向FFT。
  5. 复合共轭ComplexImageRefFinal傅里叶变换ExpFinal中的每个元素。
  6. 在我想要交叉关联的ComplexImage个对象之间执行逐元素乘法(ComplexImageExpInitExpFinalRefInit}。
  7. 将反向FFT应用于逐元素乘法的乘积。 Tadaaa,我的互相关已完成,我有两个RefFinal个对象,其中包含我的图像尺寸(2048 * 512像素)
  8. 现在我想回答我的初步问题:与ExpInit(分别为ExpFinal)相比,ExpFinal(分别为RefFinal)图像移位了多少(多少像素,以及在哪个方向)。在这里,我感到困惑。

    我有说明我应该用我的Complex[,]对象绘制一个3D图形,其中x和y是数组中的索引,z是索引处的值,并搜索最大值,但是我如何用复数做到这一点?我只使用Re部分吗?只有Im部分?幅度?还是我完全弄错了?

    奖金问题:绘制此类图表的好库是什么?

    以下是所描述的互相关的整个代码:

    Complex[,]

    非常感谢!

1 个答案:

答案 0 :(得分:1)

结果的虚部应为0(或在数值误差范围内)。要找到移位,您应该查看相关振幅的峰值位置(但除非您有一个是另一个的负像,否则可能对应于相关性的实际部分的峰值。需要注意的主要事项是:由于您将两个图像都集中在一起,因此将引入额外的移位(图像大小的一半)。

至于查看图表,您可以非常轻松地将结果映射到灰度图像,并使用您喜欢的图像查看器进行查看。