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)