展示图片差异,通过矩形框标记。

3

我是图像处理的新手,所以这里可能会问一些初学者问题。

我使用的是VS2010,.Net 4和Windows应用程序。

我想通过矩形(或其他形状)显示两个图像之间的差异。我试图参考下面链接中的类。

http://www.aforgenet.com/framework/features/template_matching.html

然而,上述链接中的代码只告诉你哪些内容匹配而不是区别。实际上,我想找到区别并在周围突出/绘制矩形。

我也尝试了AForge库中的DifferenceThresholdedDifference类,但是我可以创建一个仅显示差异的新图像,但是我想绘制矩形来标记这些差异。我不确定如何获取差异的坐标以绘制矩形?

请问有哪些类/函数可以在这里使用?

我已经尝试了EyeOpen库,但与Aforge相比,它没有太多选项,除非我在这里错过了什么。我可以尝试C#中除Aforge.Net之外的任何其他库。

谢谢, Rumit


你准备如何绘制差异周围的矩形?考虑几乎平凡的情况,即由45度绘制的线条组成的差异。你想要一个包含所有变化的矩形吗?还是为每个像素变化都设计一个小小的矩形? - John
2个回答

4

请告诉我,我是否正确理解了你的问题:你想比较两张图片,如果它们之间有差异,则通过在差异周围绘制矩形来显示这种差异。

如果这是您唯一要实现的功能,那么我不会使用任何外部库,而是只会逐像素比较图像,然后在不匹配的区域周围绘制一个矩形。

假设两个图像具有相同的大小,您可以使用简单的循环来获取不同像素的坐标:

//the images are loaded in Bitmap image1, image2;
for (int x = 0; x < image1.Width; x++)
{
    for (int y = 0; y < image1.Height; y++)
    {
        if (image1.GetPixel(x, y) != image2.GetPixel(x, y))
        {
            posX = x; posY = y; //position of the pixel that is different
        }
    }
}

接下来,您只需使用DrawRectangle()绘制一个围绕由posXposY指定的像素的矩形即可。如果您想检测所有差异,则可以创建一个像素坐标数组,在每次发现差异时添加项目,然后在所有差异周围绘制矩形。

很抱歉,使用GetPixel()会相当慢。如果您的目标是速度,则建议使用LockBits()UnlockBits()进行像素操作(请参见MSDN Library)。


我在使用外部库之前尝试过这种方法,但是在上述方法中,很难确定绘制矩形的区域。例如,在我原始帖子中的链接中有一张带有两个矩形的玫瑰图片。如果我逐像素进行操作,很难决定在哪里绘制矩形。请告诉我是否有遗漏?我正在寻找一种应用程序,可以查找多个差异并突出显示它们! - rumit patel
@rumitpatel 对不起,我仍然不明白你想要实现什么。如果是模板匹配,即将图像与某个模板进行比较并突出显示匹配区域,则可以使用你在问题中发布的链接中编写的确切代码。如果是查找两个图像之间的差异,则可以使用我的答案中的代码或其他差异技术。您还可能希望找到单个图像中的某些区域差异并进行比较,但我不知道这有什么用处。 - SysGen

2
我在这里发布了一个答案,强调了两个图像之间的差异。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接