检查一张图片是否与另一张图片偏移

Check if a picture is shift of another

本文关键字:一张 是否 检查      更新时间:2023-10-16

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

提前谢谢。

您可以简单地使用普通的2D互相关并检测最大值所在的位置来确定(x,y)偏移。根据互相关定理,您可以在傅立叶域中有效地实现这一点。

在github上的Matlab中看到这个简单的例子,交叉相关和峰值发现

编辑

以下是图像的刚性配准的简短且大部分不完整的指南。互相关思想的要点如下:假设我有一个1D矢量:

t = [1 2 3 1 2 3 4 ]

我把这个矢量移了4位,得到了一个新的矢量t2:

t2 = [2 3 4 1 2 3 1]

现在我来看看tt2之间所谓的互相关c

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

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

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

offset = -4

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

现在,很明显,空间域中的相互关联需要大量操作。这就是上面提到的互相关定理的作用所在,它将空间域中的相关与傅立叶域中的乘法联系起来。傅立叶变换具有许多非常快速的实现(FFT),所需的操作少得多,因此它们被用于确定互相关。

有许多方法可以处理所谓的刚性配准,从卫星和假日图像的拼接到医学成像应用中经常发现的叠加来自不同来源的图像。

在您的特定情况下,您可能需要查看相位相关性。c书中的数字食谱也包含了傅立叶和相关的章节。

这个问题在文献中被称为"二维模式匹配"(提示:谷歌)
这是一篇描述最优和朴素算法的论文:

快速二维模式匹配

另一个流行的术语是"子矩阵匹配",但当你想要一定程度的模糊性而不是精确匹配时,通常会使用它。以下是此类算法的示例:

基于子矩阵匹配的局部形状识别在局部匹配引导下的图像标记