OpenCV图像处理—— 模板匹配

      模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。

      工作原理:在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

       局限性:它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。

 

常见的模板匹配算法:

OpenCV图像处理—— 模板匹配_第1张图片

①TM_SQDIFF是平方差匹配;TM_SQDIFF_NORMED是标准(归一化)平方差匹配。利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大。

②TM_CCORR是相关性匹配;TM_CCORR_NORMED是标准相关性匹配。采用模板和图像间的乘法操作(卷积结果),数值越大表示匹配程度较高, 0表示最坏的匹配效果。

③TM_CCOEFF是相关性系数匹配;TM_CCOEFF_NORMED是标准相关性系数匹配。用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,也是值越大,匹配效果也好。1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)。

 

#模板匹配
import cv2 as cv
import numpy as np
def template_demo():
    tpl =cv.imread('F:/Desktop/image/target.JPG')
    image = cv.imread("F:/Desktop/image/a.JPG")
    cv.namedWindow('template image', cv.WINDOW_NORMAL)
    cv.imshow("template image", tpl)
    cv.namedWindow('target image', cv.WINDOW_NORMAL)
    cv.imshow("target image", image)
    #TM_SQDIFF_NORMED是标准(归一化)平方差匹配;TM_CCORR_NORMED是标准相关性匹配;TM_CCOEFF_NORMED是标准相关性系数匹配
    methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED]   #3种模板匹配方法
    th, tw = tpl.shape[:2]
    for md in methods:
        print(md)
        result = cv.matchTemplate(image, tpl, md)
        min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
        if md == cv.TM_SQDIFF_NORMED:
            tl = min_loc
        else:
            tl = max_loc
        br = (tl[0]+tw, tl[1]+th)   #br是矩形右下角的点的坐标
        cv.rectangle(image, tl, br, (0, 0, 255), 2)
        cv.namedWindow("match-" + np.str(md), cv.WINDOW_NORMAL)
        cv.imshow("match-" + np.str(md),image)

template_demo()
cv.waitKey(0)
cv.destroyAllWindows()

 

你可能感兴趣的:(OpenCV图像处理—— 模板匹配)