如何以最快的方式检查小图片是否在大图片中?
(缩放后的图片:)
需要找到的图片:
我有一个解决方案,但它非常慢:
- 我循环遍历大图中的每个像素(x,y),并比较小图的像素(0,0)(颜色值)。
- 如果像素相同,我会迭代小图片并将其与更大的图片进行比较。 如果失败,则返回到大图片扫描循环。
这种方法需要约7秒钟才能在1600x1200照片中找到一个50x50的图像。
也许您知道更好的算法? 我知道一款软件可以在不到一秒钟内完成此操作。
如何以最快的方式检查小图片是否在大图片中?
(缩放后的图片:)
需要找到的图片:
我有一个解决方案,但它非常慢:
这种方法需要约7秒钟才能在1600x1200照片中找到一个50x50的图像。
也许您知道更好的算法? 我知道一款软件可以在不到一秒钟内完成此操作。
您的算法最坏情况下为 O(hA*wA*hB*wB)
,其中hA
、wA
、hB
和wB
分别是大图像A
和小图像B
的高度和宽度。
这个算法的最坏情况应该是O((wA+wB)*hA*hB)
它基于字符串匹配,工作原理如下:
A
的每一行中查找图像B
的每一行。matched_row
中存储三元组(rA,cA,rB)
,其中(rA,cA)
表示文件B
的rB
行在图像A
中的起始点。cA
,然后按rA
,最后按rB
对matched_row
进行排序。现在,您遍历数组,如果匹配了5行的图像B,则会得到以下结果:
(12, 5, 0), (13, 5, 1), (14, 5, 2), (15, 5, 3), (15, 5, 4)
另一个答案通过图像卷积(通过乘以FFT实现)描述了交叉相关。但有时您需要使用归一化交叉相关-请参见http://scribblethink.org/Work/nvisionInterface/nip.html,获得全面讨论和快速实现的详细信息。