OpenCV匹配模板

时间:2013-01-15 05:22:13

标签: python image-processing opencv

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

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

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

2 - 任何替代方法!! :)

如果有任何事情不清楚,请告诉我!

编辑(附加信息): 正如评论中所讨论的,我附加了我目前的匹配技术,即缩放模板匹配。请注意附加的图像纯粹是出于测试目的而不是我正在使用的实际图像集(不能发布,因为图像是proprieotry) 来源图片A screen shot from youtube 徽标图片Got from wikipedia 使用模板匹配Red block indicating the best match wrt highest score

输出图像

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

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

1 个答案:

答案 0 :(得分:3)

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

链接到OpenCV Docs中的高斯模糊:

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);

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