2

使用这张图片作为参考,我想在这张图片的底部找到脏点。

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

我在想,我需要在像 n × n 像素这样的区域中找到最小差异,而不是具有相同坐标的像素之间的差异。所以问题是:OpenCV 是否有针对该问题的解决方案和/或是否有更好的解决方案?

编辑:使用threshold和的解决方案erode

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;
}
4

2 回答 2

3

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

于 2013-05-17T10:51:57.440 回答
1

您可以创建一个相似度图,其中每个像素都将与针对每个像素的 n x b 区域计算的直方图比较值进行关联。

于 2013-05-17T10:54:56.187 回答