比较图像以找出差异

时间:2010-03-31 13:50:20

标签: .net image image-processing compare

任务:我的装配线末端安装了一个摄像头 捕获生产物品的图像。我们举个例子说,我们 制作门票(上面有一些文字和图片)。所以每一个 生成的票据被拍照并保存到磁盘上作为图像。现在我 我想检查这些保存的图像是否有异常(即比较 他们到图像(模板),这是好的)。所以,如果有问题 在我们的装配线上有一张票(缺少图片,污渍......),我的 应用程序应该找到它(因为它的图像与我的图像差别太大 模板)。

问题:比较图片和查找的最简单方法是什么 他们之间的差异?我是否需要编写自己的方法,或者我可以 使用现有的?如果我只设置一个公差值会很棒 (即图像可以相差1%),将两个图像放在一个函数中并得到 返回值为true或false:)

工具:C#或VB.NET,Emgu.CV(OpenCV的.NET包装器)或类似的东西

6 个答案:

答案 0 :(得分:3)

我对OpenCV了解不多,但对图像处理有点了解。

前进的方式取决于拍摄新照片的频率。一种简单的方法是计算“好”模板的差异图片和实际产品的图像。

如果图像100%相同,则生成的图像应为空。如果有残留像素,您可以对这些像素进行计数,并将其作为偏离标准的度量。

但是,您必须匹配其中一个图像的方向(可能还有比例)以对齐边框,否则此方法将无效。

如果您有时间约束,您可能希望在处理之前减少图像中的信息(例如,使用边缘检测和/或将其转换为灰度或甚至单色位图,如果您的产品功能足够重要的话)< / p>

答案 1 :(得分:2)

我建议查看AForge Imaging library,因为它有很多非常有用的功能用于此类工作。

您可以使用以下几种方法:

  1. 简单减法(模板图像 - 当前)并查看有多少像素不同。您可能希望对结果进行阈值处理,即仅包含不同10或更多的像素(例如)。
  2. 如果票证可以在视野中移动,那么除非您可以先找到票证,否则项目1)将不起作用。例如,如果票证在黑色背景上是白色的,您可以在图像上设置一个阈值,这样可以让您很好地了解票证的位置。
  3. 我之前使用过的另一种技术是“模型查找”或“模式匹配”,但我只知道包含这些功能的商业库Matrox Imaging Library(或MIL),因为它们并非无足轻重。
  4. 此外,您需要确保知道故障单的哪些部分更重要。例如,我猜想丢失的徽标或水印是一个大问题。但是某些区域可能有可变文本,例如序列号,因此您希望它们不同。基本上,您可能需要将图像的某些区域与其他区域区别对待。

答案 2 :(得分:1)

我不知道细节,但我知道在高吞吐量必不可少的工业环境中,有时使用神经网络。它们将数百万比特(相机像素)变为1(好或坏)。 也许这会帮助您进行搜索。

答案 3 :(得分:1)

肯定有应用程序和库已经做了你想做的事情,但我不知道任何事情。显然,人们可以对这两个图像进行哈希处理并进行比较,但是期望事物相同并且不会为光线差异或类似事物留下任何余地。

假设您已经控制了图像中对象的方向相同且位置相同,那么可以做的一件事就是遍历每个图像的像素,并获得每个图像的HSV值这样:

Color color1 = Image1.GetPixel(i,j);
Color color2 = Image2.GetPIxel(i,j);
float hue1 =    color1.GetHue();
float sat1 =    color1.GetSaturation();
float bright1 = color1.GetBrightness();
float hue2 =    color2.GetHue();
float sat2 =    color2.GetSaturation();
float bright2 = color2.GetBrightness();

并与这些值进行一些比较。我认为,这可以让你比使用RGB值更可靠,特别是因为你想在比较中加入一些公差。


编辑:

为了好玩,我写了一个使用上述想法的小样本应用程序。基本上它总计了H,S和V值相差一些量的像素数(我选择了0.1作为我的值),然后如果H,S或V计数器超过38400或2%,则从比较循环中退出。像素(0.02 * 1600 * 1200)。在最坏的情况下,比较两个相同的图像花了大约2秒钟。当我比较一个已被改变到足以超过2%值的图像时,通常只需要几分之一秒。

显然,如果每秒产生大量图像,这可能会太慢,但我认为无论如何它都很有趣。

答案 4 :(得分:1)

我不是该领域的专家,但听起来你需要这样的东西

http://en.wikipedia.org/wiki/Template_matching

并且它支持OpenCV支持模板匹配 http://nashruddin.com/template-matching-in-opencv-with-example.html

答案 5 :(得分:1)

This guy here为同样的问题编写了一个简单的Java代码。我想,将它转换为C#并不难。它工作得很好,也可以在其中找到更新更强的版本。