检查图片是否移动了另一张图片

时间:2012-10-09 09:30:34

标签: c++ image image-processing c++11

我有两个图像(大小相同),我想检查第二个图像是否与第一个图像相同但是有一些移位。所以更正式地我有两个相同大小的矩阵A,B我想查看B的子矩阵是否出现在A中。但是由于这些图片很大(400x400),我需要一种有效的方法。可接受的复杂性是O(n ^ 3)。有没有办法可以做或者我应该把图像缩小?:)

提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以简单地使用普通的2D交叉相关并检测最大值所在的位置以确定(x,y)偏移。在Cross-correlation theorem之后,您可以在傅立叶域中有效地实现此功能。

在github上的Matlab中看到这个简单的例子,cross correlationpeak finding

修改

以下是图像刚性注册的简短且大部分不完整的指南。互相关思想的要点如下: 说我有一维矢量:

t = [1 2 3 1 2 3 4 ]

我将此向量移动-4位,从而产生新的向量t2

t2 = [2 3 4 1 2 3 1]

现在我来看看ct之间所谓的互相关t2

c = [1 5 11 15 17 25 38 37 28 24 29 18 8]

现在,此互相关向量位于位置或索引38上的最大值7。我们可以用来确定这种转变如下:

offset = round((7-(length(c)+1))/2)

offset = -4

其中length()给出了此维度中元素的维数或数量,以及互相关结果。

现在,显而易见,Spacial域中的互相关需要大量操作。这就是上面提到的cross-correlation theorem发挥作用的地方,它将空间域中的相关与傅里叶域中的乘法联系起来。傅里叶变换具有许多非常快速的实现(FFT),需要极少的操作,因此它们被用于确定互相关。

有许多方法可以处理所谓的卫星和假日图像拼接的刚性配准,以及覆盖来自不同来源的图像,如医学成像应用中常见的那样。

在您的特定情况下,您可能需要查看Phase correlationNumercial recipes in c book还包含有关傅立叶和相关性的章节。

答案 1 :(得分:2)

这个问题在文献中称为“二维模式匹配”(提示:google it)。
这篇论文描述了最优算法和天真算法:

Fast two dimensional pattern matching

另一个流行的术语是“子矩阵匹配”,但通常在需要某种程度的模糊性而非精确匹配时使用。以下是此类算法的示例:

Partial shape recognition by sub-matrix matching for partial matching guided image labeling