检查一张图片是否与另一张图片偏移
Check if a picture is shift of another
我有两个图像(大小相同),我想检查第二个图像是否与第一个图像相同,但有一些偏移。因此,更正式地说,我有两个大小相同的矩阵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]
现在我来看看t
和t2
之间所谓的互相关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书中的数字食谱也包含了傅立叶和相关的章节。
这个问题在文献中被称为"二维模式匹配"(提示:谷歌)
这是一篇描述最优和朴素算法的论文:
快速二维模式匹配
另一个流行的术语是"子矩阵匹配",但当你想要一定程度的模糊性而不是精确匹配时,通常会使用它。以下是此类算法的示例:
基于子矩阵匹配的局部形状识别在局部匹配引导下的图像标记
- C++ Chrono 确定一天是否是周末?
- 如何从另一张地图构造一张地图
- C++显示图像并将其保持到下一张图像的最佳方法
- OpenGL Ping Pong可与一张通行证一起工作,而不是两个通行证
- 画一张卡,并打电话给它
- 如何在C 中执行主程序时是否通过了一分钟是否通过
- 洗牌一张牌
- 检查一张图片是否与另一张图片偏移
- 在 Windows 中自动将 xlsx 文件转换为多个 (MS-DOS) CSV 文件(每张一张一个)
- 把一个价格(例如89.95美元)读成一张双人床
- 我怎样才能进行倒计时,每秒检查一次是否输入了某些内容,而不会中断
- 如何将地图的反面复制到另一张地图上
- CUDA,我需要一张新卡吗?1.0、1.1、2.0、2.1的差异
- 如何找到不在另一张地图的键中的地图键
- 有没有一张多维地图
- 用c++中的printf制作一张表格
- 使用浮点数时,在0和1之间进行归一化是否好
- 我正在尝试比较来自两个输入文件的数据,以查看一组是否比另一组少
- 用简单的opengl图像库(SOIL)加载一张图像(颜色空间:GRAY)
- 找一张智能地图