我有两个图像(大小相同),我想检查第二个图像是否与第一个图像相同但是有一些移位。所以更正式地我有两个相同大小的矩阵A,B我想查看B的子矩阵是否出现在A中。但是由于这些图片很大(400x400),我需要一种有效的方法。可接受的复杂性是O(n ^ 3)。有没有办法可以做或者我应该把图像缩小?:)
提前致谢。
答案 0 :(得分:4)
您可以简单地使用普通的2D交叉相关并检测最大值所在的位置以确定(x,y)偏移。在Cross-correlation theorem之后,您可以在傅立叶域中有效地实现此功能。
在github上的Matlab中看到这个简单的例子,cross correlation和peak finding
修改
以下是图像刚性注册的简短且大部分不完整的指南。互相关思想的要点如下: 说我有一维矢量:
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
上的最大值7
。我们可以用来确定这种转变如下:
offset = round((7-(length(c)+1))/2)
offset = -4
其中length()
给出了此维度中元素的维数或数量,以及互相关结果。
现在,显而易见,Spacial域中的互相关需要大量操作。这就是上面提到的cross-correlation theorem发挥作用的地方,它将空间域中的相关与傅里叶域中的乘法联系起来。傅里叶变换具有许多非常快速的实现(FFT),需要极少的操作,因此它们被用于确定互相关。
有许多方法可以处理所谓的卫星和假日图像拼接的刚性配准,以及覆盖来自不同来源的图像,如医学成像应用中常见的那样。
在您的特定情况下,您可能需要查看Phase correlation。 Numercial 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