OpenCV学习笔记-模板匹配

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

所以模板匹配首先需要一个模板图像T(给定的子图像)
另外需要一个待检测的图像S(源图像)

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

匹配算法:
TM_SQDIFF: 使用 平方差 进行匹配,因此最佳的匹配结果在结果为0处,值越大匹配结果越差。

TM_SQDIFF_NORMED使用 归一化的平方差 进行匹配,最佳匹配也在结果为0处。

TM_CCORR:相关性匹配方法,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳匹配位置在值最大处,值越小匹配结果越差。

TM_CCORR_NORMED:归一化的相关性匹配方法,与相关性匹配方法类似,最佳匹配位置也是在值最大处。

TM_CCOEFF:相关性系数匹配方法,该方法使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表示二者不相关。

TM_CCOEFF_NORMED:归一化的相关性系数匹配方法,正值表示匹配的结果较好,负值则表示匹配的效果较差,也是值越大,匹配效果也好。

匹配方法的选取根据实际情况而定,下面我们测试了三种归一化算法:
可以看出来 TM_CCOEFF_NORMED的效果最明显,找到最大值后,将其绘制到原图像上。 这里注意匹配结果图像与原图像之间的大小关系,他们之间差了一个模板大小

源码:
def template_demo():
    roi = cv.imread('img/lenaeye.png')
    target = cv.imread('img/lena.png')
    cv.imshow('template image', roi)
    cv.imshow('target image', target)

    methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED]
    th, tw = roi.shape[:2] # 模板图像的高 宽

    for method in methods:
        print(method)
        result = cv.matchTemplate(target, roi, method)
        '''
        matchTemplate(image, templ, method, result=None, mask=None)
        image: 待搜索图像
        templ: 模板图像
        method: 匹配算法
        result: 返回结果,其必须为单通道,32位浮点型图像,如果源图像尺寸为W*H,匹配图像尺寸为w*h,result的尺寸一定为(W-w+1)*(H-h+1)
        '''
        min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
        #minMaxLoc的作用是在数组中找到全局最小值和最大值
        #min_val, max_val 最小值和最大值
        #min_loc, max_loc 最小位置和最大位置
        if method == cv.TM_SQDIFF_NORMED:
            #归一化的平方差匹配算法,值越小匹配效果最佳
            tl = min_loc
        else:
            #相关性匹配和相关性系数匹配都是值越大匹配效果最好
            tl = max_loc

        br = (tl[0]+tw, tl[1]+th) # 边框的坐标
        cv.rectangle(target, tl, br, (0, 0, 255), 2)
        # cv.imshow('match-'+np.str(method), target)
        cv.imshow('match-'+np.str(method), result)

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/80328000