OpenCV图像处理—— 模板匹配
模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
工作原理:在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。
局限性:它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
常见的模板匹配算法:
①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()