[OpenCV基礎][Python]特徵匹配Template Matching

2024/04/12閱讀時間約 4 分鐘

先上結果圖,從圖中有本書被紅框包住。

此結果就是利用OpenCV提供的函式cv2.matchTemplatecv2.minMaxLoc所完成的。


結果圖

結果圖

結果圖


以下程式範例主結構為這兩個函式

cv2.matchTemplate

利用設定的樣本圖,來搜索圖像中相似的特徵物,並回傳一個灰階影像,其中每個像素表示該像素的鄰域與模板的匹配程度。

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

返回值:

result : 匹配結果的圖像,即包含相似度得分的圖像。可選參數。

參數

  • image: 待搜索的圖像,即被搜尋的圖像。
  • templ: 模板圖像,即要在待搜索圖像中尋找的目標。
  • method: 指定匹配的方法。這是一個枚舉值,用來指定計算相似度的方式,例如 cv2.TM_SQDIFFcv2.TM_CCORRcv2.TM_CCOEFF 等。
  • mask: 可選的遮罩圖像,用於指定哪些區域進行匹配。

method個人比較常用以下三種

歸一化後的平方差,數值介於0到1之間,比較直觀好處理。

cv2.TM_CCOEFF_NORMED

正規化相關性係數,且除本身圖像明亮,只保留圖像分佈,分數越相似

cv2.TM_CCORR_NORMED

正規化相關性係數(correlation),分數越相似

cv2.TM_SQDIFF_NORMED

正規化後的平方差,可以適應原始圖像及模板同時提高亮度的狀況,但只有其中之一的圖像光線調整,仍然會產生問題


cv2.minMaxLoc

找到最大/最小值在哪裡。以它為矩形的左上角,(w,h)為矩形的寬度和高度

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(src[, mask])

返回值:

  • minVal: 圖像中的最小值。
  • maxVal: 圖像中的最大值。
  • minLoc: 最小值的位置,即其 (x, y) 座標。
  • maxLoc: 最大值的位置,即其 (x, y) 座標。

參數:

  • src: 輸入圖像。
  • mask: 可選的遮罩圖像,用於指定要考慮的圖像區域。

程式範例

待搜索的圖像

原圖

原圖

樣本圖

樣本圖

樣本圖

import cv2
import numpy as np

# 讀取圖檔
img = cv2.imread('./org.jpg')
template = cv2.imread('./temp.png')

# 圖像轉換成灰階
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

# 框取相似圖,需定義好框的大小​,框設定與樣本圖圖片大小一致
h, w = template.shape[:2]

# 指定匹配的方法​
method = cv2.TM_SQDIFF_NORMED

# matchTemplate()傳入待匹配圖像和模板圖像、匹配方法,得到的結果是一個單通道的float32浮點類型的圖像
res = cv2.matchTemplate(img_gray, template_gray, method)

# minMaxLoc()計算最佳匹配位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

# TM_SQDIFF_NORMED, 此方法要取最小值,代表最佳位置
if method in [cv2.TM_CCOEFF_NORMED, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc

#給​rectangle框 右下的位置
bottom_right = (top_left[0] + w, top_left[1] + h)

#框取搜尋到的特徵圖​
cv2.rectangle(img,top_left, bottom_right, (0,0,255), 1)

# 顯示結果圖像
cv2.imshow('reuslt', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

有關特徵匹配更詳細的介紹說明可以參考以下文章

參考文獻




49會員
86內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!