找到2个图像之间差异的边界框?

时间:2012-03-10 20:13:36

标签: algorithm image delta bounding

我有2个位图图像,其中1是另一个的略微变化。 现在我想尽可能快地计算变化区域的边界框。 有没有一个聪明的算法可以做到这一点,还是只是一个暴力处理的情况?

编辑: 图像将是screencaptures。我想找到更改区域的最小边界框,如“在此框之外没有任何变化”。

1 个答案:

答案 0 :(得分:1)

如果你只想要一个边界框,你绝对可以比“强力”(总是检查所有像素,2 * w * h操作)做得更好,至少如果图像之间有任何差异。只需从4个不同的边框开始查找4个不同的行/列像素。伪代码:

bounding_box_y1 = -1;
loop y = 1..h {
 loop x = 1..w {
   if image1(x,y) != image2(x,y) {
     bounding_box_y1 = y
     exit loops
   }
 }
}

上面的伪代码遍历图像行,从顶行开始直到找到不同的像素,返回bounding_box_y1。只需再添加3个循环(从底部开始的行=> bounding_box_y2,从左开始的列=> bounding_box_x1,从右边开始的列=> bounding_box_x2)并且您将拥有以下坐标:你的边界框。

此算法仍然对相同的图像执行2 * w * h操作(请注意,在这种情况下,bounding_box_y1将保留-1并且您可以跳过额外的3个循环),但会更快如果图像有差异(在最佳情况下仅检查4个角像素)。

编辑:在我看到您的问题编辑后,我想到了另一种方法:如果您将图像与其他图像进行多次比较,则可以存储其他校验和信息,例如:存储16x16像素区域的校验和将需要一些额外的存储空间,但比较校验和而不是像素要快得多,并给出了一个“估计”的布局框 - 如果你可以使用它或者之后改进它,你可以直接使用它。在任何一种情况下,这都将比上述方法快得多,特别是对于最坏的情况。但是,这取决于您的设置,并且是“速度大小”权衡。