【问题标题】:OpenCV match templateOpenCV 匹配模板
【发布时间】:2013-01-15 05:22:12
【问题描述】:

我正在尝试将我拥有的徽标(模板)与一些图像相匹配。我的图像本质上都是彩色的,我这样做的方式是使用来自 openCV 的 cvMatchTemplate() 并在我的源图像上运行模板(徽标)。我将模板缩放到多个级别以找到最佳匹配。请注意,我只是在图像上找到数字印记的徽标,而不是场景中存在的徽标。 例如:从这张图片中检测天空运动http://i56.tinypic.com/2v3j3wx.jpg(这张图片纯粹是为了我的任务的表现和清晰度,而不是我正在使用的图片

我的图像不是固定分辨率,所以我将其放大到标准的 800x600。现在,当我的源图像分辨率很差时说 300x300,结果很普通。我在模板参数中使用 method=CV_TM_CCOEFF_NORMED 并且即使是准确匹配的分数也很低(在 0 到 1.0 的范围内低至 0.4),这让我很难自信地说出徽标是否存在。 我对此有两个问题:

1 - 在 opencv 模板匹配中,它如何处理彩色图像。我试图从文档中理解,我的推论是它分别计算每个通道的分数并取最好的。如果不是这样,我最好考虑所有三个渠道以获得更好的结果

2 - 任何替代方法! :)

如果有不清楚的地方请告诉我!

编辑(附加信息): 正如在 cmets 中所讨论的,我附上了我当前的匹配技术,即缩放模板匹配。请注意,所附图像纯粹用于测试目的,并不是我正在使用的实际图像集(无法发布,因为图像是专有的) 图片来源 标志图片 使用模板匹配输出图像

虽然模板匹配,但此处获得的最佳匹配分数为 0.59。虽然相对来说这是一个不错的比赛分数,但仍然不足以让我确定所需的标志是否存在。在我的测试图像中,当屏幕上的徽标是透明的时,它仍然会检测到徽标,但得分为 0.3-0.4。使用 SURF/SIFT 可以获得更好的结果吗?

编辑(尝试使用 SURF) 我尝试运行已经在 opencv 官方文档 (minHessian = 2000) 中作为示例给出的 SURF 代码。link here 这是输出。我不确定如何解释它(2,3 点似乎在预期的范围内。这被认为是好的吗?还有什么建议吗? 谢谢

【问题讨论】:

  • 归一化互相关对于该任务来说可能是一种太弱的方法。您可能需要一个关键点检测器,然后在两个图像中进行关键点匹配。这种事情的一种典型方法称为SURF。您能否包含您希望匹配的实际图像(坏的图像和模板)?
  • 感谢您的回复。我确实考虑过 SIFT/SURF 技术,但有人建议我,这对我的应用程序来说太过分了。但我想确定 SURF 会提高我的精度。除了阅读 SURF 示例代码之外,任何关于如何完成任务的人都需要注意。这些图像本质上是专有的,但是我会尝试在免费提供的图像中复制这些行为并将它们发布在此处以便更好地解决问题。
  • 要确保 SURF 提高您的精度,这很简单:使用它并检查它是否能提高您的精度。谁建议你反对它?原因是什么? (矫枉过正当然不是原因)。
  • 至于您的第一个问题:您将如何结合所有三个渠道?没有全球公认的方法,但在这方面常见的一件事是转移到 CIELAB 颜色空间并考虑那里的欧几里德距离(最简单的 Delta E)。
  • 真的一模一样吗?徽标不是半透明的,因此您在其下方的图像实际上可能会对其进行很多修改吗?它真的总是完美地在同一个旋转中吗?图像采集那么好吗?另外,你提到缩放,怎么不考虑缩放?在我能想象到的所有情况下,您收到的这些建议似乎都是错误的。

标签: python image-processing opencv


【解决方案1】:

在执行模板匹配之前,您是否尝试过在源图像上使用高斯模糊?这可能会为您提供更准确的结果,因为我认为源图像的质量会导致更差的匹配

OpenCV 文档中的高斯模糊链接:

OpenCV Python Gaussian Blur

或者,您可以尝试对区域模板匹配建议的直方图比较技术,以额外确认返回的模板匹配相关性(即使很小)是正确的值:

Drawing Histograms

绘制直方图是可选的,它可能对您自己的应用程序有用

Comparing the Histograms

^ 此方法计算图像(源和模板)的直方图以及它们之间的相关性... 但是,您不想要整个源的直方图,只是模板匹配认为最佳相关性所在的位置,或者图像中的某个其他位置,因此您想要获得感兴趣区域 (ROI) 的直方图,请参阅以下 C++ 代码:

Mat OriginalImage = imread("source.jpg", 0);
Rect RegionOfInterest = Rect(150, 150, 250, 250);
Mat ROIImage = OriginalImage(RegionOfInterest);

这可让您计算感兴趣区域的直方图。您应该获得模板的直方图和模板匹配认为您的模板在源中的区域的直方图,并比较它们以确认或反驳模板匹配输出

【讨论】:

  • 嗨,不,我没有做高斯模糊,你说得对,图像质量很差,因为我的模板图像质量很高。那么我应该对模板徽标图像进行高斯模糊处理吗?
  • 高斯模糊的想法是删除信息 - 我建议你将它添加到系统中,因为我认为它会简化设置模板匹配(相关)阈值 - 所以我会说这取决于,我通常会模糊源,但是因为模板质量更好我会玩这个方法,主要是尝试模糊模板和源,或者只是模糊模板(但因为我没有看到图像源的模糊也可以工作,但很可能不如其他两个解决方案...)我在文档中附上了高斯模糊的链接
  • 顺便说一句,如果模板匹配不起作用,我还有另一种简单的图像处理技术可以用于检测,但首先我们将看看高斯模糊是否有帮助
  • 如果你也能告诉我这种技术,那就太好了。这个问题一直悬而未决,我会尝试一下并在一天内发布结果!
  • 模板图像上的高斯模糊肯定会增加我的得分,从 0.59 到上图到 0.72。不利的一面是,即使对于没有徽标的图像,得分也有所增加,但增加了一个较小的因素(这很好)。我将对您规定的方法进行一些测试和分析,然后返回详细信息!感谢肯定令人鼓舞的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多