OpenCV+python:模板匹配
1,模板匹配的概念及原理
模板匹配是一項在一幅圖像中尋找與另一幅模板圖像最匹配(相似)部分的技術(shù).
我們需要2幅圖像:
模板 (T): 將和原圖像比照的圖像塊
原圖像 (I): 在這幅圖像里,我們希望找到一塊和模板匹配的區(qū)域
我們的目標(biāo)是檢測最匹配的區(qū)域:
為了確定匹配區(qū)域, 我們不得不滑動模板圖像和原圖像進(jìn)行比較:
通過滑動, 我們的意思是圖像塊一次移動一個像素 (從左往右,從上往下). 在每一個位置, 都進(jìn)行一次度量計算來表明它是 “好” 或 “壞” 地與那個位置匹配 (或者說塊圖像和原圖像的特定區(qū)域有多么相似)
對于 T 覆蓋在 I 上的每個位置,你把度量值 保存 到 結(jié)果圖像矩陣 R中. 在 R 中的每個位置 (x,y) 都包含匹配度量值:
上圖就是 TM_CCORR_NORMED 方法處理后的結(jié)果圖像 R . 最白的位置代表最高的匹配. 正如您所見, 紅色橢圓框住的位置很可能是結(jié)果圖像矩陣中的最大數(shù)值, 所以這個區(qū)域 (以這個點為頂點,長寬和模板圖像一樣大小的矩陣) 被認(rèn)為是匹配的.
實際上, 我們使用函數(shù) minMaxLoc 來定位在矩陣 R 中的最大值點 (或者最小值, 根據(jù)函數(shù)輸入的匹配參數(shù)) .
OpenCV通過函數(shù) matchTemplate 實現(xiàn)了模板匹配算法. 可用的方法有6個:
源代碼:
import cv2 as cv
import numpy as npdef template_demo():tpl = cv.imread("F:/images/T.png") #模板圖像target = cv.imread("F:/images/I.png")#原圖像cv.imshow("template image", tpl)cv.imshow("target image", target)methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED] #標(biāo)準(zhǔn)平方差匹配 ,標(biāo)準(zhǔn)相關(guān)匹配,標(biāo)準(zhǔn)相關(guān)系數(shù)匹配th, tw = tpl.shape[:2] #模板的高寬for md in methods:# print(md)result = cv.matchTemplate(target, tpl, md) #像素點的相關(guān)度量值min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result) #尋找匹配最值(大小和位置)if md == cv.TM_SQDIFF_NORMED:tl = min_locelse:tl = max_locbr = (tl[0]+tw, tl[1]+th); #確定匹配區(qū)域cv.rectangle(target, tl, br, (0, 0, 255), 2)#將匹配區(qū)域繪制到原圖上cv.imshow("match-"+np.str(md), target)# cv.imshow("match-" + np.str(md), result)src = cv.imread("F:/images/I.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
template_demo()
cv.waitKey(0)cv.destroyAllWindows()
運行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的OpenCV+python:模板匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 银川山羊下水多少钱?大量收够山羊下水,羊
- 下一篇: OpenCV+python:图像二值化