与OpenCV进行模板匹配时,如何避免误报?

时间:2018-09-20 12:05:29

标签: python opencv image-processing

我想使用OpenCV和Python制作一个程序,以检查较小的图像是否在较大的图像内。

我知道大图像中的内容,但是小图像可能每次都会改变,因此对我来说,避免误报很重要。

我在cv2.matchTemplate模式下使用cv2.TM_CCOEFF_NORMED来检查置信度,如果较小的图像只是完整图像的裁剪版本,效果很好。

但是,例如,如果较小的图像是1x1白色像素,则会出现问题。我的大图上有很多空白,我不希望这样匹配。

这是我的代码:

#!/usr/bin/env python

import cv2


def main():
    source = cv2.imread('source.png', 0)
    template = cv2.imread('template.png', 0)

    res = cv2.matchTemplate(source, template, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    if max_val < 0.9:
        print 'Confidence score is less than 0.9, no match found.'
        return

    print 'Match found!'

if __name__ == '__main__':
    main()

我该如何改善?我想有一种方法可以检查匹配是否至少一定大小(例如50x50),以便在使用微小图像作为模板时系统不会中断,但我不确定。

2 个答案:

答案 0 :(得分:1)

如果图像变小,如1x1,则图像的特征变少。正确匹配非常困难。

在适当大小的模板匹配之后,您可以尝试其他匹配算法。

  1. SURF(或SIFT)匹配:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html

-SURF是一种用于生成图像描述符的算法。它从图像中找到几个特征,并为每个特征建立向量。并且您可以使用诸如L2-Distance之类的距离计算来比较其他图像的特征之间的相似度。

  1. 颜色直方图匹配:https://en.wikipedia.org/wiki/Histogram_matching

-颜色直方图是图像自身的颜色分布。您可以尝试使用它来比较多个图像的相似性。

答案 1 :(得分:0)

使用模板匹配进行正匹配后,从大图像中获取补丁,并使用更多图像比较方法来验证您的匹配。您必须比较两个相同大小的图像。例如。如上所述的直方图匹配,模板与其他规范的匹配,统计数据的比较(均值,方差,较高矩)等。

另一个选择是检查“第二最佳匹配”的得分。分数应小于“最佳匹配”。这样可以确保更大的图像中没有其他类似的补丁。这样可以消除您的“ 1x1白色像素”错误匹配。

如果旋转模板,则可能需要更复杂的方法来查找和提取初始补丁位置。

请记住,不可能在所有情况下都避免误报。总是应该有一个反例。尤其是如果您的模板很小。

对于合理的模板大小,请查看基于特征的匹配方法(SIFT,SURF,..)或光流匹配的建议补丁大小。首先猜测-您的模板应大于21x21像素