在大图片中查找小图片的快速算法?

时间:2011-09-07 14:26:47

标签: .net algorithm image-processing image

检查小图片是否在大图片内的最佳(最快)方法是什么?

(缩放图片:)

enter image description here想要找到: enter image description here

我有一个解决方案,但速度很慢:

  • 我遍历大图中的每个像素(x,y)并比较小图片的像素(0,0)(颜色值)。
  • 如果像素是相同的,我会遍历小图片并将其与较大的图片进行比较..如果失败,它会回到大图片扫描循环..

此方法需要约7秒才能在1600x1200照片上找到50x50 pic。

也许你知道一个更好的算法?我知道一个软件可以在一秒钟内完成。

5 个答案:

答案 0 :(得分:6)

可以使用数学运算convolution(可以使用Fast Fourier Transform有效实施)。

答案 1 :(得分:1)

另一个答案描述了通过图像卷积的交叉相关(通过乘法来实现)。但有时您希望使用规范化互相关 - 请参阅http://scribblethink.org/Work/nvisionInterface/nip.html以获得完整的讨论和快速实施的详细信息。

答案 2 :(得分:1)

如果您知道像素值将是精确的,这只是字符串匹配问题的特殊情况。有很多快速字符串匹配算法,我从Boyer-MooreKnuth-Morris-Pratt开始。

答案 3 :(得分:1)

你的算法最糟糕的是O(hA*wA*hB*wB),其中hAwAhBwB是大图像的高度和宽度{ {1}}和小图片A

这个算法应该是B

的最坏情况

它基于字符串匹配,这就是它的工作原理:

  • 每次使用字符串匹配在图像O((wA+wB)*hA*hB)的每一行中查找图像B的每一行。
    • 每次匹配时,都会在数组A中存储三元组matched_row,其中(rA, cA, rB)代表(rA, cA)图像的A起点文件行rB
  • 现在,您先根据Bmatched_row进行排序,然后再cA然后再rA
  • 现在你迭代数组,如果你匹配5行的图像B,你会得到这样的结果:

    rB

答案 4 :(得分:0)

我想在10x10图像中切割两个图像,计算每个小图像的“平均”颜色并执行与您相同的算法。

这应该适用于任何算法,因为它只影响常数因子。