一、模板匹配函数 cv2.matchTemplate()
result = cv2.matchTemplate(image=*,templ=*,method=*,mask=*)
result:函数返回值,比较结果的数组。
image:原始图像。
templ:模板图像。templ.shape<image.shape。
method:搜寻匹配程度的方法,常见方法如下:
方法 | 值 | 解释 |
TM_SQDIFF | 0 | 平方差匹配法,完全匹配时为0,匹配越差值越大 |
TM_SQDIFF_NORMED | 1 | 归一化平方差匹配法 |
TM_CCORR | 2 | 相关匹配法,模板图像矩阵与原始图像矩阵相乘,数值越大匹配越好,如果是0表示匹配最差。 |
TM_CCORR_NORMED | 3 | 归一化相关匹配法 |
TM_CCOEFF | 4 | 相关系数匹配法,采用相关匹配法对(模板减去均值的结果)和(原始的图像减去均值的结果)进行匹配,1表示匹配最好;0表示没有相关,-1表示最差匹配。 |
TM_CCOEFF_NORMED | 5 | 归一化相关系数匹配法 |
mask:模板使用的掩膜,大小必须与模相同,默认为:None。
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('mario.jpg')
cv2.imshow('mario',img)
temp = cv2.imread('mario_coin.jpg')
cv2.imshow('mario_coin',temp)
result1 = cv2.matchTemplate(image=img,templ=temp,method=cv2.TM_SQDIFF)
result2 = cv2.matchTemplate(image=img,templ=temp,method=cv2.TM_CCORR)
result3 = cv2.matchTemplate(image=img,templ=temp,method=cv2.TM_CCOEFF)
print(result1,'\n',result2,'\n',result3)
cv2.waitKey(0)
cv2.destroyAllWindows()
[[ 6731990.5 6308971. 5926512. ... 11313114. 11551437. 11873021. ]
[ 6924833. 6503345. 6123767.5 ... 11313135. 11550929. 11870760. ]
[ 7069597. 6646704. 6247641. ... 11313315. 11550517. 11880881. ]
...
[17794236. 15902143. 15727139. ... 14817700. 14878067. 14288622. ]
[17701296. 15850301. 15705493. ... 14744390. 14826834. 14169278. ]
[17251248. 15429999. 15308911. ... 14386932. 14420212. 13770000. ]]
[[2428959.8 2373233. 2267798. ... 3667868.2 4292994. 4769557. ]
[2326548. 2267831. 2164031.8 ... 3667858. 4293216. 4770027. ]
[2328443. 2264163. 2163468. ... 3667768. 4293295. 4769835. ]
...
[3778746. 3714959. 3812971. ... 3882576. 3646878. 3620958. ]
[3806750. 3713757. 3800528. ... 3885964.2 3631411.2 3646322.2]
[3818794. 3752779. 3825091.5 ... 3908170.2 3677171.2 3703511.5]]
[[ 313878.88 418755.53 488566.2 ... 509782.8 792269.2 953014.75 ]
[ 210708.95 313194.16 383586.47 ... 509772.56 792581.3 953958.94 ]
[ 177531.81 277073.8 353193.72 ... 509682.56 792745.8 952602.56 ]
...
[-183124.92 -14288.917 87049.54 ... 177207.12 -8289.875 28152.758]
[-156109.62 -15939.287 71745.33 ... 186032.53 -13804.405 61460.53 ]
[ -72219.44 89040.71 162471.64 ... 271467.6 95619.11 174962.28 ]]
二、单目标模板匹配
在原始图像中只选择最相似的一个相似图案当作结果,称为单目标匹配。
minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(src=*,mask=*)
minVal:函数返回最小值。
minLoc:函数返回最小值坐标。
src:输入矩阵。
import cv2
img = cv2.imread('Lena.png') #原始图像
cv2.imshow('Lena',img)
temp = img[250:280,240:290,:] # 模板
cv2.imshow('Lena_eye',temp)
h,w = temp.shape[:2] # 模板的高和宽
result = cv2.matchTemplate(image=img,templ=temp,method=cv2.TM_SQDIFF) # 模板匹配
minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(src=result) # 找出匹配结果的值和坐标
upperleft = minLoc # 左上角的坐标
lowerright = (minLoc[0]+w,minLoc[1]+h) # 右下角的坐标
img1 = cv2.rectangle(img.copy(),upperleft,lowerright,(255,0,0),3) # 在原图上画出模板匹配出的区域
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、多目标模板匹配
在原始图像中选择最相似的一多个相似图案当作结果,称为单多目标匹配。
import cv2
import numpy as np
origianl = cv2.imread('mario.jpg') #原始图像
cv2.imshow('mario',origianl)
img = cv2.imread('mario.jpg',0) # 灰度图像
temp = img[46:66,70:84] # 模板
h,w = temp.shape[:2] # 模板的高和宽
# 模板匹配
result = cv2.matchTemplate(img, temp, cv2.TM_CCORR_NORMED)
#取匹配程度大于80%的坐标
index = np.where(result > 0.8)
for i in zip(*index[::-1]): #*代表可选参数
img1 = cv2.rectangle(origianl, i, (i[0]+w, i[1]+h), (255,0,0), 1)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()