OpenCV笔记(模板匹配)

模板匹配指在一幅图像中寻找出给定的模板,原理非常简单,遍历图像中每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标。

OpenCV提供了相应的函数来完成这个操作

matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像
minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置

OpenCV 提供了 6 种两张图片相似度方法

1、差值平方和匹配 CV_TM_SQDIFF

方法利用图像与模板各个像素差值的平方和来进行匹配,最好匹配为 0。 匹配越差,匹配值越大。

2、标准化差值平方和匹配 CV_TM_SQDIFF_NORMED

这个方法跟差值平方和算法是类似。只不过对图像和模板进行了标准化操作。该标准化操作可以保证当模板和图像各个像素的亮度都乘上了同一个系数时,相关度不发生变化。

3、相关匹配 CV_TM_CCORR

这类方法采用模板和图像的互相关计算作为相似度的度量方法,所以较大的数表示匹配程度较高,0标识最坏的匹配效果

4、标准相关匹配 CV_TM_CCORR_NORMED

这个方法和 标准化差值平方和匹配 类似,都是去除了亮度线性变化对相似度计算的影响。可保证图像和模板同时变亮或变暗k倍时结果不变

5、相关匹配 CV_TM_CCOEFF

这种方法也叫做相关匹配,但是和上面的 CV_TM_CCORR 匹配方法还是有不通过的。简单的说,这里是把图像和模板都减去了各自的平均值,使得这两幅图像都没有直流分量。

6、标准相关匹配 CV_TM_CCOEFF_NORMED

这是 OpenCV 最复杂的一种相似度算法。运用了数理统计学科的相关系数计算方法。具体的说,就是在减去了各自的平均值之外,还要各自除以各自的方差。经过减去平均值和除以方差这么两步操作之后,无论是我们的待检图像还是模板都被标准化了,这样可以保证图像和模板分别改变光照亮不影响计算结果。计算出的相关系数被限制在了 -1 到 1 之间,1 表示完全相同,-1 表示两幅图像的亮度正好相反,0 表示两幅图像之间没有线性关系。

 

import cv2


def template_macth(src, template, method):
    result = cv2.matchTemplate(src, template, method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        loc = min_loc
    else:
        loc = max_loc
    return loc


def main():
    template = cv2.imread('img03.png', 1)
    src = cv2.imread('img04.png', 1)
    methods = [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF, cv2.TM_CCOEFF_NORMED]
    locations = []
    for method in methods:
        locations.append(template_macth(src, template, method))
    print(locations)


main()

你可能感兴趣的:(opencv)