两个图像相似 - 测量

时间:2011-12-14 17:37:23

标签: image-processing opencv machine-learning computer-vision

我必须决定,如果两个图像(一个模板图像,一个扭曲图像)几乎相似。图像可能在亮度,某些标记或不同数字上有一些差异。也可能是扭曲的图像移动了1或2个像素。 (参见我的示例图片!)

我该如何解决这个问题?我正在使用OpenCV / C ++。

4 个答案:

答案 0 :(得分:5)

我很确定图像的全局测量不会单独起作用。特别是,要确定数字是否相同,将不适用于图像范围的测量。 我的第一个猜测是,至少做一个三步程序。

1。找到角落里的黑色标记

我不知道您在图像注册方面有多少背景,但这可能适用于非常轻的版本。分别搜索每个黑色标记。首先,您可以稍微平滑图像(可能是r = 1的高斯图像)以抑制噪声,然后使用非常低的阈值对图像进行二值化以杀死几乎所有“非黑色”部分。这看起来像这样的好图像

enter image description here

您会看到那些没有任何内容的标记完全针对这些应用程序。现在,我能想象的最简单的版本可能是这样的:在每个角落采取合理的区域。 合理的意味着,黑色标记绝对应该在那里。现在计算所有黑色像素位置的平均值。这是你猜测一个黑色标记的中心。在上面的例子中,这个猜测是完美的,应该给真正的中心。但是,如果图像质量较差,则该区域可能存在噪声/错误的黑色像素。

在这种情况下,可能需要严格注册步骤。由于你只是试图找到黑色方块,因此这个注册应该不是很难实现。

2。找到数字

当您找到黑色角标时,您知道它们跨越一个矩形,您可以计算重要数字所在的区域。如果图像实际上只是某些像素关闭,那么这一步可能是不必要的,您可以为您的数字选择固定区域。

例如,请参见右下角的数字:它始终直接位于底部标记之间,在右侧,从底部标记之间的长度的1/4到几乎正确的标记。你必须更好地测量这个区域,但是根据你的标记位置,你可以根据黑色标记来表达这个区域。

3。比较数字区域(字符识别)

如开头所述,我不确定是否通过整个区域的图像测量来比较两个数字区域是否足够好。您当然可以尝试看看它是否有效。但是我怀疑1和7之间的区别是否如此之大,以至于你可以肯定地说,那些区域匹配它们不匹配

既然你可以提取数字相当好的区域,为什么不使用一些基本的OCR并且不比较数字的图像,而是比较数字呢?

答案 1 :(得分:1)

如果可以,我会提前挑选一些基准点,找到他们的位置和相对位置。确保编号正确,布局“足够接近”。这些例子中的基准点的例子是“左上角的红色三角形”,文字标题等......

答案 2 :(得分:0)

如果这些图像具有代表性,我建议对红色通道进行阈值处理,并计算水平和垂直投影的直方图(分别沿行和列的平均值)。匹配查询图像的直方图应该与原型图像的直方图相当接近。

答案 3 :(得分:0)

我处理过类似的问题,我们使用了许多仿射变换来比较模板图像中网格的图像空间和扭曲图像中网格的图像空间。我认为,一旦你可以“取消”图像的某些部分,图像处理的其余部分应该更直接。

正如halirutan所说,你已经有了一些基准标记。归一化的互相关应该容易识别那些黑色方块。这些为最粗糙的仿射变换定义了四个比较点。 http://en.wikipedia.org/wiki/Affine_transformation

在模板和扭曲图像之间进行粗仿射变换后,您可以使用相对较小的搜索区域来查找每个网格左上角的三角形基准点。然后,可以使用由扭曲图像中的四个相邻三角形(或四个红线交叉点)形成的四边形来找到将该网格空间与模板图像中的匹配网格空间相关联的仿射变换。

在模板图像中的每个网格与变形图像中的每个网格之间进行仿射变换后,您可以取消扭曲变形图像中的像素并进行其他处理。

  1. 仅在一个颜色平面(例如RGB中的红色)中操作
  2. 找到局部阈值(例如移动平均值)以将颜色平面二值化。局部或自适应阈值技术应该消除变化的背景强度。鉴于您的样本图像,全局阈值可能不是最佳选择。
  3. (可能)进行变形关闭操作以简化形状。
  4. 使用网格识别像素的相对密度。 (这类似于规范化的互相关,但将区域划分为网格方块。)
  5. (或)使用简单的图像纹理测量,例如Laws Texture Measures进行比较。
  6. http://en.wikipedia.org/wiki/Image_texture#Laws_Texture_Energy_Measures