C++ 检查一张图片是否是另一张图片的偏移

C++ 检查一张图片是否是另一张图片的偏移,c++,image,image-processing,c++11,C++,Image,Image Processing,C++11,我有两张图像(大小相同),我想检查第二张图像是否与第一张图像相同,但有一些偏移。因此,更正式地说,我有两个大小相同的矩阵A,B,我想检查B的子矩阵是否出现在A中。但由于这张图很大(400x400),我需要一种有效的方法来这样做。可接受的复杂度为O(n^3)。有没有办法,或者我应该把图像缩小一些 提前感谢。您可以简单地使用常规二维互相关,并检测最大值所在的位置,以确定(x,y)偏移。遵循以下步骤,您可以在傅立叶域中有效地实现这一点 在github上的Matlab中可以看到这个简单的例子,并且 编辑

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


提前感谢。

您可以简单地使用常规二维互相关,并检测最大值所在的位置,以确定(x,y)偏移。遵循以下步骤,您可以在傅立叶域中有效地实现这一点

在github上的Matlab中可以看到这个简单的例子,并且

编辑

下面是关于图像刚性配准的简短且不完整的指南。互相关思想的要点如下: 假设我有一个一维向量:

t=[12314]

我将这个向量移动4个位置,得到一个新的向量
t2

t2=[2 3 4 1 2 3 1]

现在我来看一下
t
t2
之间所谓的互相关
c

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

现在,该互相关向量在位置或索引
7
上的最大值为
38
。我们可以通过以下方式确定该变化:

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

offset=-4

其中
length()

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

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


在您的特定情况下,您可能需要查看。本手册还包含一章关于傅里叶变换和相关性

这个问题在文献中称为“二维模式匹配”(提示:googleit)
以下是一篇描述优化算法和朴素算法的论文:

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


你不能再详细解释一下吗?伪代码可能是因为我对Matlab不太了解。在一些实现中,相关性是在图像金字塔上运行的,从最小的图像开始,一直到完全分辨率。1/4比例的匹配可以确定最佳拟合的可能区域,然后在更大比例的匹配中可以找到更精确的拟合。