溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python?OpenCV怎么實現(xiàn)圖像模板匹配

發(fā)布時間:2022-04-07 10:01:27 來源:億速云 閱讀:405 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下Python OpenCV怎么實現(xiàn)圖像模板匹配的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1.什么是模板匹配及模板匹配方法matchTemplate()

介紹

提供一個模板圖像,一個目標圖像,且滿足模板圖像是目標圖像的一部分,從目標圖像中尋找特定的模板圖像的過程,即為模板匹配。OpenCV提供了matchTemplate()方法幫助我們實現(xiàn)模板匹配。

該方法語法如下:

cv2.matchTemplate(image, templ, method, result=None, mask=None)

其中

image 即目標圖像

templ 即模板圖像

method 是匹配的方式

mask 即掩模,可選。只有當method為cv2.TM_SQDIFF或cv2.TM_CCORR_NORMED時才支持此參數(shù)。

method參數(shù)可以是以下值:

參數(shù)值描述
cv2.TM_SQDIFF差值平方和匹配,也稱平方差匹配??梢岳斫鉃槭腔诓町惓潭鹊钠ヅ?,差異程度越小,匹配程度越高。完全匹配時值差值平方和為0。
cv2.TM_SQDIFF_NORMED相關匹配。 可以理解為是基于相似程度的匹配,相似程度越高,計算結果越大,匹配程度就越高。
cv2.TM_CCORR標準相關匹配。 規(guī)則同上。
cv2.TM_CCORR_NORMED相關系數(shù)匹配
cv2.TM_CCOEFF相關系數(shù)匹配。也是基于相似程度的匹配,計算結果是一個-1到1的浮點數(shù),1表示完全匹配,0表示毫無關系,-1表示兩張圖片亮度剛好相反。
cv2.TM_CCOEFF_NORMED標準相關系數(shù)匹配,規(guī)則同上。

使用matchTemplate()方法,模板會將圖像中的每一塊區(qū)域都覆蓋一遍,并每次都使用所選的method方法進行計算,每次的計算結果最后以一個二維數(shù)組的形式返回給我們。

素材準備

為方便展示,特準備以下圖片素材:

選擇世界名畫《三英戰(zhàn)呂布》(test.png),圖像shape為(738, 675, 3):

Python?OpenCV怎么實現(xiàn)圖像模板匹配

從中摳出一部分圖像元素作為下邊要用的模板素材。取材代碼如下( 不建議截圖,截圖摳出來的不一定能保證尺寸):

import cv2
img = cv2.imread("test.png")

print(img.shape)
# 電燈
img1 = img[20:220, 320:480, :]
# 虎牢關牌匾
img2 = img[75:150, 200:310, :]
# 青龍刀
img3 = img[170:530, 575:650, :]
# 關云長
img4 = img[270:670, 160:330, :]


cv2.imshow("img0", img)
cv2.imshow("img1", img1)
cv2.imshow("img2", img2)
cv2.imshow("img3", img3)
cv2.imshow("img4", img4)
cv2.waitKey()
cv2.destroyAllWindows()

cv2.imwrite('template_pic1.jpg', img1)
cv2.imwrite('template_pic2.jpg', img2)
cv2.imwrite('template_pic3.jpg', img3)
cv2.imwrite('template_pic4.jpg', img4)

取出的模板素材如下:

電燈

Python?OpenCV怎么實現(xiàn)圖像模板匹配

虎牢關牌匾

Python?OpenCV怎么實現(xiàn)圖像模板匹配

青龍刀

Python?OpenCV怎么實現(xiàn)圖像模板匹配

關云長

Python?OpenCV怎么實現(xiàn)圖像模板匹配

2.單模板匹配

單模板匹配,即在匹配時中只使用到一個模板的匹配過程。具體又可以分為單目標匹配和多目標匹配。

2.1 單目標匹配

單目標匹配,即模板在目標圖像中只匹配 匹配程度最高的一個匹配結果。

這需要找出這一次匹配結果所在位置的坐標來確定其位置,

OpenCV提供了cv2.minMAXLoc()來實現(xiàn)。

該方法參數(shù)為matchTemplate()的返回值,會返回一個元組,元組中有四個值,分別是最小值、最大值、最小值時圖像左上角頂點坐標,最大值時圖像左上角頂點坐標。

接下來,使用 電燈(template_pic1) 圖片來匹配原圖,并用紅色的矩形在原圖像中圈出模板圖像,使用標準差值平方和的匹配方式,代碼如下:

import cv2
img = cv2.imread("test.png")

templ = cv2.imread("template_pic1.jpg")
height, width, c = templ.shape
results = cv2.matchTemplate(img, templ, cv2.TM_SQDIFF_NORMED)
# 獲取匹配結果中的最小值、最大值、最小值坐標和最大值坐標
minValue, maxValue, minLoc, maxLoc = cv2.minMaxLoc(results)
resultPoint1 = minLoc
resultPoint2 = (resultPoint1[0] + width, resultPoint1[1] + height)
cv2.rectangle(img, resultPoint1, resultPoint2, (0, 0, 255), 2)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

如圖所示,成功標出了模板圖。

Python?OpenCV怎么實現(xiàn)圖像模板匹配

如果要從多幅圖像中,找出與模板最匹配的結果,

以標準差值平方和的匹配方式為例,
則可以對這些圖像進行遍歷,并比較每幅圖像對應結果中的最小值,找出最小值中的最小值,則為最佳匹配項。

以兩幅圖像為例,將原圖翻轉一次,生成一張新的圖像(翻轉后結果與原圖較像,但差異巨大)

翻轉產生素材(test1.png)

import cv2
img = cv2.imread("test.png")
dst1 = cv2.flip(img, 1)
cv2.imshow("dst1", dst1)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('test1.png', dst1)????????

Python?OpenCV怎么實現(xiàn)圖像模板匹配

然后使用模板 關云長 (template_pic4.jpg)對兩幅圖像進行匹配,輸出最佳匹配結果,并畫紅框展示:

import cv2

image = []
image.append(cv2.imread("test.png"))
image.append(cv2.imread("test1.png"))
templ = cv2.imread("template_pic4.jpg")
height, width, c = templ.shape

# 循環(huán)變量初始化
# 這里只是隨便設定一個值,該值并無意義,只是為了定義該變量
# 使用TM_SQDIFF_NORMED計算方法,計算出的結果通常是小于1的,所以minValue可以設置為1。如果是TM_SQDIFF計算方法,則就不行了,計算出來的值會很大。代碼就不再有效,需要把minMax設得更大,或者做其他修改。
index = -1
minValue = 1
minLoc1 = (0, 0)

# 遍歷每幅圖像
for i in range(0, len(image)):
    results = cv2.matchTemplate(image[i], templ, cv2.TM_SQDIFF_NORMED)
    min = cv2.minMaxLoc(results)[0]
    if min < minValue:
        minValue = min
        minLoc1 = cv2.minMaxLoc(results)[2]
        index = i

minLoc2 = (minLoc1[0] + width, minLoc1[1] + height)
cv2.rectangle(image[index], minLoc1, minLoc2, (0, 0, 255), 2)
cv2.imshow("result", image[index])
cv2.waitKey()
cv2.destroyAllWindows()

如圖,test.png中的關云長與模板更為匹配。

Python?OpenCV怎么實現(xiàn)圖像模板匹配

2.2 多目標匹配

多目標匹配,即在目標圖像中匹配出所有與模板圖像匹配的結果??梢允褂孟嚓P匹配或相關系數(shù)匹配。

素材準備

還以原圖像"test.png"為參照,

為了產生方便我們做示例的圖像,我們在該圖像的基礎上多加一盞電燈,生成"test2.png"

import cv2
img = cv2.imread("test.png")
templ = cv2.imread("template_pic1.jpg")
img[20:220, 30:190, :] = templ
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('test2.png', img)??????

Python?OpenCV怎么實現(xiàn)圖像模板匹配

多目標匹配

多目標匹配即對matchTemplate()匹配的總的結果,的計算情況數(shù)據(jù),使用for循環(huán)遍歷,并設定一個判斷標準。

如使用標準相關系數(shù)(cv2.TM_CCOEFF_NORMED)的方法判斷,如:如果計算值大于0.99,則我們認為匹配成功了。

使用電燈模板"template_pic1.jpg",匹配圖像test2.png。并對匹配的結果用紅色的矩形框標記。

代碼示例如下:

import cv2
img = cv2.imread("test2.png")
templ = cv2.imread("template_pic1.jpg")
height, width, c = templ.shape
# 按照標準相關系數(shù)匹配
results = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED)
for y in range(len(results)):
    for x in range(len(results[y])):
        if results[y][x] > 0.99:
            cv2.rectangle(img, (x, y), (x + width, y + height), (0, 0, 255), 2)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

程序執(zhí)行結果如下,成功匹配出了兩盞燈。

Python?OpenCV怎么實現(xiàn)圖像模板匹配

3.多模板匹配

多模板匹配,即進行了n次單模板的匹配過程。&emsp;

直接上示例:

在test.png中匹配電燈、青龍刀、虎牢關牌匾、關云長四個圖像模板:

import cv2


def myMatchTemplate(img, templ):
    height, width, c = templ.shape
    results = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED)
    loc = list()
    for i in range(len(results)):
        for j in range(len(results[i])):
            if results[i][j] > 0.99:
                loc.append((j, i, j + width, i + height))
    return loc

# 讀取原始圖像
img = cv2.imread("test.png")  
# 模板列表
templs = list()  
templs.append(cv2.imread("template_pic1.jpg"))
templs.append(cv2.imread("template_pic2.jpg"))
templs.append(cv2.imread("template_pic3.jpg"))
templs.append(cv2.imread("template_pic4.jpg"))


loc = list()  
for t in templs: 
    loc += myMatchTemplate(img, t) 

# 遍歷所有紅框的坐標
for i in loc:  
    cv2.rectangle(img, (i[0], i[1]), (i[2], i[3]), (0, 0, 255), 2) 

cv2.imshow("img", img) 
cv2.waitKey() 
cv2.destroyAllWindows()

匹配效果如下:

Python?OpenCV怎么實現(xiàn)圖像模板匹配

以上就是“Python OpenCV怎么實現(xiàn)圖像模板匹配”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI