4

我有一堆“简单”的图像,我想比较它们是否相似。我使用模板匹配 ( ) 将它们相互比较cv::matchTemplate,结果非常好。

现在我想微调我的程序,但我遇到了一个问题。例如,我有两张看起来非常相似的图像。他们唯一的区别是另一个有更粗的线和项目的数字前面不同。当两幅图像都很小时,线条粗细的一个像素差异会在进行模板匹配时产生很大的结果差异。当线条粗细相同并且唯一的区别是前面的数字时,我会得到类似于匹配成功时0.98的模板匹配结果。CV_TM_CCORR_NORMED当线条粗细不同时,匹配结果类似于 0.95。

我不能将阈值降低到 0.98 以下,因为其他一些类似的图像具有相同的线条粗细。

以下是示例图像:

在此处输入图像描述 在此处输入图像描述

那么我有什么选择呢?

我努力了:

  • 扩大原件和模板
  • 侵蚀也两者
  • 形态学前两者
  • 计算关键点并进行比较
  • 寻找角落

但还没有大的成功。这些图像是否太简单以至于难以检测“好的特征”?

任何帮助都非常受欢迎。

谢谢!

编辑:

这是其他一些示例图像。我的程序认为相似的内容放在同一个 zip 文件夹中。 压缩

4

3 回答 3

3

一种可能的方法可能是细化两个图像,以便每条线都有一个像素宽度,因为不同的厚度会导致您出现相似性的主要问题。

该过程将首先对图像进行二值化/阈值化,然后对两个图像应用细化操作,因此两者现在都具有相同的 1 px 厚度。然后使用您之前使用的常用模板匹配,效果很好。

如果您想了解有关二值图像细化/骨架化的更多详细信息,请参阅各种讨论论坛和 OpenCV 群组上发布的一些 OpenCV 实现:

  1. 用于细化的 OpenCV 代码(Guo 和 Hall 算法,适用于 CvMat 输入)
  2. 使用 OpenCV的 JR Parker 实现
  3. 这里的代码可能更高效(大量使用 OpenCV 优化的访问方法,但是大部分页面都是日文的!)
  4. 最后,如果您有兴趣,请简要概述变薄。
于 2012-06-03T02:49:34.580 回答
2

你需要一些更基本的东西,没有太多理由去寻找花哨的方法。你的数字已经是二进制的,它们的形状总体上非常相似。

一个初步的想法:考虑某个图像中的上点和下点,并形成上壳和下壳(只是一个壳,而不是凸壳或其他任何东西)。如果给定 column i,它是从图像顶部(底部)开始的第一个点,而不是背景点i. 此外,您的图像主要是一个单一的连接组件(在某些情况下,垂直条分开,但这很好),因此您可以轻松丢弃小组件。这一步对您的情况很重要,因为我看到有些数字带有某种形式的噪声,与图像的其余部分无关。考虑到少于 100 个点的连接组件很小,这些是您为问题中包含的各个图像获得的外壳:

在此处输入图像描述

在此处输入图像描述

蓝线表示上层船体,绿线表示下层船体。如果不明显,当我们考虑这些船体的区域最大值和区域最小值时,我们会在两者中获得相同的数量。y此外,除了轴上的一些位移外,它们都非常接近。如果我们考虑极值的平均x位置并将两个图像的线绘制在一起,我们会得到下图。在这种情况下,蓝色和绿色的线条用于第二张图像,红色和青色的线条用于第一张图像。红点位于x某些区域最小值的平均坐标中,蓝点相同,但区域最大值(这些是我们的兴趣点)。(下图已调整大小以获得更好的可视化效果)

在此处输入图像描述

如您所见,您无需执行任何操作即可获得许多几乎重叠的点。如果我们做得更少,即甚至不关心这种重叠,并继续以微不足道的方式对图像进行分类:如果一个图像a和另一个图像b在上层外壳中具有相同数量的区域最大值,则相同数量的区域最小值在上船体,下船体的区域最大值相同,底船体的区域最小值相同,则ab属于同一类。对所有图像执行此操作,所有图像都正确分组,但以下情况除外:

在此处输入图像描述

在此处输入图像描述

在这种情况下,第一张图像中的上层船体只有 3 个最大值和 3 个最小值,而第二张图像有 4 个最大值和 4 个最小值。在您看到船体和获得的兴趣点的图之后:

在此处输入图像描述 在此处输入图像描述

如您所见,在第二个上层船体中有两个非常接近的极值。平滑这条曲线消除了两个极值,使图像通过简单的方法匹配。另外,请注意,如果您在图像周围绘制一个矩形,那么此方法将告诉它们都是相等的。在这种情况下,您将需要比较多个船体,丢弃当前船体中的点并构建其他船体。尽管如此,这种方法能够正确地对所有图像进行分组,因为它们都非常简单并且几乎没有噪音。

于 2013-01-25T21:25:46.010 回答
1

据我所知,困难在于形状相同,只是大小不同。一个简单的破解方法可能是: - 减去图像,然后腐蚀。如果形状相同但稍大一点,则减法将只留下边缘,边缘会变薄并消失,并带有侵蚀作为噪声。

更正式一些,将是采用轮廓,然后是近似多边形并进行不变量比较(Hu Moments等)

于 2012-06-03T09:05:44.127 回答