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

更新 發佈閱讀 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()

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

參考文獻




留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
153會員
300內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/02/15
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
2025/02/15
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
2024/12/02
中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。 後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於
Thumbnail
2024/12/02
中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。 後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於
Thumbnail
2024/10/03
在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
Thumbnail
2024/10/03
在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
Thumbnail
看更多
你可能也想看
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange與搭配cv2.bitwise_and,將紅球過濾出來吧。 程式範例 因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
Thumbnail
用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange與搭配cv2.bitwise_and,將紅球過濾出來吧。 程式範例 因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
Thumbnail
使用cv2.imread讀取圖片時,如果路徑有包含到中文,就會報錯。 本文將提供另外一個方式cv2.imdecode,路徑有包含到中文時仍可以正常讀取圖片。 測試範例 import cv2 img = cv2.imread('D:/CRABpy/write/圖檔/chars_01.png'
Thumbnail
使用cv2.imread讀取圖片時,如果路徑有包含到中文,就會報錯。 本文將提供另外一個方式cv2.imdecode,路徑有包含到中文時仍可以正常讀取圖片。 測試範例 import cv2 img = cv2.imread('D:/CRABpy/write/圖檔/chars_01.png'
Thumbnail
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
Thumbnail
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
Thumbnail
觀看本文將可以學習到如何利用Numpy求得物件的邊緣點,及算出物件的寬跟高。 有詳細的程式邏輯說明,及各函式用法說明。 綠點及紅點則是採樣到的邊界點,比較粗的點是偵測到的最大值 完整程式碼 import cv2 import numpy as np import matplotl
Thumbnail
觀看本文將可以學習到如何利用Numpy求得物件的邊緣點,及算出物件的寬跟高。 有詳細的程式邏輯說明,及各函式用法說明。 綠點及紅點則是採樣到的邊界點,比較粗的點是偵測到的最大值 完整程式碼 import cv2 import numpy as np import matplotl
Thumbnail
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。 OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
Thumbnail
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。 OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News