2013-05-17 153 views
2

使用this图片作为参考我想查找this图片底部的脏点。两张图片之间的差异

我能够将第二个图像转换为相同的比例和方向,现在尝试使用absdiff找到该点,但由于图像不完美,我在diff image上有边缘。

我在想,代替具有相同坐标的像素之间的差异,我需要在像n乘n像素的区域找到最小差异。所以问题是:OpenCV是否有这方面的帮助和/或是否有更好的解决方案?

编辑:解决方案使用thresholderode

public static Image<Bgr, Byte> Diff(Image<Bgr, Byte> image1, 
            Image<Bgr, byte> image2, 
            int erodeIterations=2) 
{ 
    return Diff(image1, image2, new Bgr(50, 50, 50), erodeIterations); 
} 

public static Image<Bgr, Byte> Diff(Image<Bgr, Byte> image1, 
            Image<Bgr, byte> image2, 
            Bgr thresholdColor, 
            int erodeIterations) 
{ 

    var diff = image1.AbsDiff(image2); 
    diff = diff.ThresholdToZero(thresholdColor); 
    diff = diff.Erode(erodeIterations); 
    return diff; 
} 

回答

3

不确定OpenCV的,但解决这一问题应该不难。对齐这两个图像,并找出您已经完成的差异图像。在差异图像上使用NxN滑动窗口,并计算在窗口内显着不同的像素数量,即忽略高达10个灰度级别的差异。在整个图像上查找这些总和的最大值,这应该突出显示您需要的。

+0

问题在于图像可能永远不会完美对齐,因为在用于透视变换的单应矩阵中总是存在一些错误。 – Igonato

+0

确实如此,但如果图像应该与图像匹配的区域相差很小,则只应在差异图像中获取边缘。有可见噪声的地方,您将在差异图像中获得整个高强度区域。在你的代码中,你正在寻找一个区域的最小差异。我建议你改变这个来计算显着不同像素的数量,然后找到最大值。 – Zaphod

+0

我有你的想法,它可以比我做的更好。 – Igonato

1

您可以创建一个相似度图,其中每个像素将与在每个像素上聚焦的n×b区域上计算出的直方图比较值一起分配。

+0

是否有内置的东西? – Igonato