訂閱
糾錯
加入自媒體

對象檢測:模板匹配

簡介

模板匹配是一種高級計算機視覺方法,可檢測與預定模板匹配的圖像部分。先進的模板匹配算法檢測模板的出現(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誤匹配。

· 由于該過程耗時,該方法在計算中大型圖像的模式相關圖像時效率低下。

       原文標題 : 對象檢測:模板匹配

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號