2013-05-10 79 views
1

我是图像处理的新手。所以我可能会在这里问一个noob问题。用矩形显示图像差异

我在VS2010,.Net 4,Windows应用程序。

我想通过矩形(或任何其他形状)显示两个图像之间的差异。 我试图在下面的链接中引用该类。

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

然而,第一张照片(玫瑰的两个黄釉矩形)是我真正想要的,在上面的链接代码,告诉你什么东西都匹配,而不是分歧。我实际上想要找出差异并突出显示/绘制矩形区别。

我试过DifferenceThresholdedDifference类以及在AForge库,但我可以创建一个新的图像,只是显示差异,但是,我想绘制矩形围绕这些差异。我不知道如何获得不同的坐标绘制矩形?

我可以在这里使用什么类/功能的任何输入?

我已经试过EyeOpen库,但它没有很多选择与阿弗尔相比,除非我在这里丢失任何东西。我可以在C#中尝试除Aforge.Net以外的任何其他库。

问候, Rumit

+0

你究竟如何提出围绕差异绘制矩形?考虑构成45度线的差异的几乎微不足道的情况。你想要一个包含所有变化的矩形吗?或者,每个小像素的小矩形都会改变? – John 2013-05-13 21:20:19

回答

3

让我知道如果我正确地理解你的问题:你想比较两个图像,如果它们之间的差异然后绘制矩形围绕它表明这种差异。

如果这是你试图实现的唯一的事情,那么我不会使用任何外部库,而是我会比较像素逐像素,然后围绕不匹配的区域绘制矩形。

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

//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 
     } 
    } 
} 

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

恐怕使用GetPixel()是很慢的。如果您正在寻求速度,那么我建议使用LockBits()UnlockBits()进行像素操作(请参阅MSDN Library)。

+0

在移动到外部库之前,我尝试了这种方法,但在上面的方法中,很难确定绘制矩形的区域。例如,在我原来的文章链接中有一个带有两个矩形的玫瑰图片。如果我逐个像素地去,那么决定在哪里绘制矩形是非常困难的。如果我在这里丢失任何东西,让我知道吗?我正在看一个应用程序,它会发现多个区别并突出显示相同! – 2013-05-12 05:47:18

+0

@rumitpatel我很抱歉,但我仍然不明白你想达到什么。如果它是[模板匹配](http://en.wikipedia.org/wiki/Template_matching),即将图像与某个模板进行比较并突出显示匹配区域,那么您可以利用写在您问题中发布的链接上的确切代码。如果它发现[两个图像的差异](http://en.wikipedia.org/wiki/Image_differencing),那么你在我的答案或其他差异技术中使用代码。您可能还想在单个图像中查找一些区域差异并对其进行比较,但我不明白这是如何有用的。 – SysGen 2013-05-12 12:06:50