2012-03-10 84 views
0

我有2个位图图像,其中1是另一个的轻微变化。 现在我想尽可能快地计算出变化区域的边界框。 有没有一个聪明的算法来做到这一点,或者它只是一个蛮力处理的案例?找到两个图像之间的差异的边界框?

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

+0

您的意思是按照区域的变化吗? – 2012-03-10 20:16:32

+0

它们是矩形或随机图像? – 2012-03-10 20:25:51

+0

什么样的形象(照片,线条艺术等)? – Seth 2012-03-10 20:29:15

回答

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像素区域的校验和需要一些额外的存储空间,但是比较校验和而不是像素速度要快得多,并且给出了一个布局框“估计” - 您可以直接使用它,如果您可以使用它或在之后进行优化。无论哪种情况,这都会比上述方法快得多,特别是对于最差情况。但是,这取决于您的设置,并且是“速度的大小”折衷。

+0

不错,但是它是不是仍然O(n)只是一个较小的因子? – 2012-03-10 20:46:32

+0

@JohanLundberg,我认为次线方案是不可能的。如果所有像素都相同,则需要检查所有像素。 – svick 2012-03-10 21:47:48

+0

@svick肯定 – 2012-03-10 22:35:55