我有两个图像(大小相同),我想检查第二个图像是否与第一个相同,但有一些偏移。所以更正式地说,我有两个相同大小的矩阵 A,B,我想检查一个子矩阵B 发生在 A 中。但是由于这张图片很大(400x400),我需要一种有效的方法来做到这一点。可接受的复杂度是 O(n^3)。有没有办法可以做或者我应该让图像更小?:)
提前致谢。
我有两个图像(大小相同),我想检查第二个图像是否与第一个相同,但有一些偏移。所以更正式地说,我有两个相同大小的矩阵 A,B,我想检查一个子矩阵B 发生在 A 中。但是由于这张图片很大(400x400),我需要一种有效的方法来做到这一点。可接受的复杂度是 O(n^3)。有没有办法可以做或者我应该让图像更小?:)
提前致谢。
您可以简单地使用普通的 2D 互相关并检测最大值所在的位置以确定 (x,y) 偏移量。遵循互相关定理,您可以在傅里叶域中有效地实现这一点。
在 github 上的 Matlab 中查看这个简单的示例,互相关和峰值查找
编辑
以下是关于图像刚性配准的简短且大部分不完整的指南。互相关思想的要点如下:假设我有一个一维向量:
t = [1 2 3 1 2 3 4 ]
我将此向量移动 -4 个位置,从而产生一个新向量t2
:
t2 = [2 3 4 1 2 3 1]
现在我来看看和c
之间所谓的互相关:t
t2
c = [1 5 11 15 17 25 38 37 28 24 29 18 8]
现在,这个互相关向量的最大值38
位于 position 或 index 上7
。我们可以用它来确定移位,如下所示:
offset = round((7-(length(c)+1))/2)
offset = -4
其中length()
给出了互相关结果的维度或该维度中元素的数量。
现在,应该很明显,空间域中的互相关需要大量操作。这就是上面提到的互相关定理发挥作用的地方,它将空间域中的相关性与傅里叶域中的乘法联系起来。傅立叶变换具有许多非常快速的实现(FFT),需要的操作要少得多,因此它们被用于确定互相关。
有许多方法可以处理所谓的刚性配准,从卫星图像和假日图像的拼接到医学成像应用中常见的来自不同来源的叠加图像。
在您的特定情况下,您可能想看看Phase correlation。此外,C 书中的 Numercial recipes包含有关傅立叶和相关性的一章。
这个问题在文献中被称为“二维模式匹配”(提示:google it)。
这是一篇描述最优算法和朴素算法的论文:
另一个流行的术语是“子矩阵匹配”,但这通常在您想要一定程度的模糊性而不是精确匹配时使用。这是此类算法的示例: