python - 使用 OpenCV 进行模板匹配时如何避免误报?

标签 python opencv image-processing

我想使用 OpenCV 和 Python 编写一个程序来检查较小的图像是否在较大的图像中。

我知道大图里面是什么,但是小图可能每次都变,所以避免误报对我来说很重要。

我使用 cv2.matchTemplatecv2.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),这样如果将小图像用作模板,系统就不会中断,但我不确定。

最佳答案

如果图像变小如 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

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

关于python - 使用 OpenCV 进行模板匹配时如何避免误报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52424812/

相关文章:

python - 在python中读取预处理的cr2 RAW图像数据

python - 查找总和大于 50 的最短子列表

database - Django模型/SQLAlchemy肿!有没有真正的Pythonic数据库模型?

c++ - OpenCV 2.3 : Convert Mat to RGBA pixel array

c++ - 从多个 USB 摄像头捕获帧 - OpenCV,C++

python - 在 skimage 中找不到度量标准的模块。其他都ok

javascript - 我们如何使用 JavaScript 查找图像是否被修改/操作

python-3.x - 如何计算像素周围像素的平均值?

python - 为什么QWidget在继承时表现不同

python - 带有 bin 计数的 Pandas groupby