對象檢測:模板匹配
簡介
模板匹配是一種高級計算機視覺方法,可檢測與預定模板匹配的圖像部分。先進的模板匹配算法檢測模板的出現(xiàn),無論其方向或局部亮度如何。
在醫(yī)學圖像分析中,不變特征或創(chuàng)新應用通常用作對象識別領域,例如車輛跟蹤、機器人和制造。
模板匹配方法用途廣泛且易于應用,使其成為最常用的對象定位方法之一。它們的實用性主要受計算機容量的限制,因為識別大型復雜模板可能很耗時。
· 這是一種在較大圖像中搜索和定位模板的方法。
· 目標是發(fā)現(xiàn)與我們基于閾值提供的模板匹配的圖像的相同部分。
· 閾值決定了我們想要識別原始圖像中的模板的程度。
· 例如,如果我們正在使用人臉識別,并且想要檢測人的眼睛,我們可以使用眼睛的隨機圖像作為模板并搜索源(人臉)。
· 在這種情況下,由于“眼睛”因人而異,即使我們將閾值設置為 50%(0.5),眼睛也會被識別出來。
工作功能
· 只需將模板圖片滑動到輸入圖像上(如在 2D 卷積中)
· 比較模板圖片和它下面的輸入圖像。
· 將獲得的結果與閾值進行比較。
· 如果結果超過閾值,則將該部分標記為檢測到。
· 函數(shù)cv2.matchTemplate(image, template,cv2.TM_CCOEFF_NORMED)中的第一個參數(shù)是主圖像,第二個參數(shù)是要匹配的模板,第三個參數(shù)是匹配技術。
讓我們首先定義模板匹配。它是一種在源圖像中定位參考圖像(或模板圖像)的方法。在其最基本的形式中,該算法比較每個源圖像區(qū)域的模板,一次一個像素。這被稱為互相關。此過程的結果是另一個圖像,其像素值對應于模板圖像在該像素位置插入時與源圖像的相似程度。
讓我們看一下金屬瓶蓋的圖像,看看它是如何工作的。假設我們對紅色金屬瓶蓋感興趣。
讓我們編碼
讓我們看看它在 Python 中的實現(xiàn)!但首先,我們必須導入以下庫:
import cv2
import numpy as np
讓我們加載一個源圖像并將你的 RGB 源圖像轉換為灰度(它的二值化形式也可以工作)。彩色照片可用于模板匹配,但灰度或二值化圖像更易于使用。
python 代碼:
# import the necessary packages
import cv2
img = cv2.imread("32080download.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Output", img)
cv2.waitKey(0)
輸出:
要在上圖中進行模板匹配,首先,我們必須加載模板圖像
template = cv2.imread(r"template_image_path")
w, h = template.shape[::-1]
在將模板的寬度和高度存儲在 w 和 h 中之后,我們初始化一個發(fā)現(xiàn)的變量來跟蹤具有最佳匹配的圖像的區(qū)域和比例。使用模板匹配功能檢測輸入源圖像中的模板,
res = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
之后,設置所需輸出的閾值
threshold = 0.90
loc = np.where(res >= threshold)
在模板匹配對象中繪制矩形
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255),1)
顯示帶有標記模板區(qū)域的源圖像
cv2.imshow('Detected the template matching objects', img)
cv2.imshow('Template', template)
cv2.waitKey()
cv2.destroyAllWindows
我們可以利用多重縮放來避免模板和原始圖像大小不同所帶來的問題。
多尺度——新的模板匹配方法
如果你的模板尺寸與你要匹配的圖像中區(qū)域的尺寸不匹配,這并不妨礙你使用模板匹配。
多重縮放過程如下:
以各種比例循環(huán)輸入圖像。使用 cv2.matchTemplate,應用模板匹配并跟蹤具有最高相關系數(shù)的匹配(以及具有最大相關系數(shù)的區(qū)域的 x 和 y 坐標)。循環(huán)遍歷所有尺度后,選擇相關系數(shù)最高的區(qū)域作為匹配區(qū)域。
import cv2
import imutils
import numpy as np
img_rgb = cv2.imread('mainimage.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('template', 0)
w, h = template.shape[::-1]
resize = imutils.resize(img_gray, width=int(img_gray.shape[0]), height=int(img_gray.shape[1]*scale)
if resized.shape[0] < h or resized.shape[1] < w:
break
found=(maxVal, maxLoc, r)
(__, maxLoc, r)=found
(startX, startY)=(int(maxLoc[0]*r), int maxLoc[1]*r)
(finalX, finalY)=(int((maxLoc[0]+tw)*r), int(maxLoc[1]+tH)*r)
cv2.rectangle(image, (startX, startY),(finalX, finalY), (255, 0, 255), 2)
cv2.imshow("Image", image)
cv2.waitKey(0)
以下是對上述代碼的分步說明:
我們在 w 和 r 中記錄模板的寬度和高度后,初始化一個變量來跟蹤最匹配的圖像的區(qū)域和比例。然后,使用 np.linspace 函數(shù),我們開始遍歷圖像的眾多比例。這個函數(shù)接受三個參數(shù):起始值和結束值以及它們之間相等的塊切片的數(shù)量。在此示例中,我們將從原始圖像大小的 100% 開始,然后在 20 個相同大小的百分比塊中縮小到原始大小的 20%。
我們接下來將圖像調(diào)整為當前比例并計算舊寬度與新寬度的比率——正如你稍后將看到的,這個比率很關鍵。我們驗證提供的圖像是否大于我們的模板匹配。如果模板更大,我們的 cv2.matchTemplate 調(diào)用將失敗。因此,在這種情況下,我們只是退出循環(huán)。我們現(xiàn)在可以將模板匹配應用于我們的縮放圖像:
我們的相關結果被傳遞給 cv2.minMaxLoc 函數(shù),該函數(shù)返回一個 4 元組,其中包含最小相關值、最大相關值、最小值的 (x, y) 坐標和最大值的坐標 (x, y)。
因為我們只想要最大值和 (x, y) 坐標,所以我們保存最大值并拒絕最小值。之后,我們在每次縮放迭代中檢查匹配的圖像區(qū)域。然后,我們更新我們發(fā)現(xiàn)的變量以跟蹤迄今為止發(fā)現(xiàn)的最大相關值、最大值的 (x, y) 坐標以及原始圖像寬度與當前放大圖像寬度的比率。
在遍歷所有圖片比例后,我們提取我們的found變量并計算我們的邊界框的開始和結束 (x, y) 坐標。
結論
本文演示了我們?nèi)绾问褂脠D像處理來輔助對象檢測和識別。模板匹配可用作檢測機器學習和深度學習模型的對象的管道。
要點:
· 參考圖案的方向必須在模板中保留。
· 因此,它不適用于模板的旋轉或縮放版本,因為圍繞模板的對象的形狀/大。羟械鹊淖兓瘯䦟е洛e誤匹配。
· 由于該過程耗時,該方法在計算中大型圖像的模式相關圖像時效率低下。
原文標題 : 對象檢測:模板匹配
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結構工程師 廣東省/深圳市