我們經常玩匹配圖像或者找相似,opencv可以很好實現這個簡單的小功能。
模板是被查找目標的圖像,查找模板在原始圖像中的哪個位置的過程就叫模板匹配。OpenCV提供的matchTemplate()方法就是模板匹配方法,其語法如下:
?result = cv2.matchTemplate(image, templ, method, mask)
參數說明:
image:原始圖像。
templ:模板圖像,尺寸必須小于或等于原始圖像。
method:匹配的方法,可用參數值如表10.1所示。
mask:可選參數。掩模,只有cv2.TM_SQDIFF和cv2.TM_CCORR_NORMED支持此參數,建議采用默認值。
返回值說明:
result:計算得出的匹配結果。如果原始圖像的寬、高分別為W、H,模板圖像的寬、高分別為w、h,result就是一個W-w+1列、H-h+1行的32位浮點型數組。數組中每一個浮點數都是原始圖像中對應像素位置的匹配結果,其含義需要根據method參數來解讀。
在模板匹配的計算過程中,模板會在原始圖像中移動。模板與重疊區域內的像素逐個對比,最后將對比的結果保存在模板左上角像素點索引位置對應的數組位置中
OpenCV的matchTemplate函數是用來在一幅圖像中尋找另一幅圖像的匹配的。在匹配過程中,可以選擇不同的匹配方法,也就是method參數。常用的method參數有以下幾種:
- cv2.TM_SQDIFF:平方差匹配法,最簡單的匹配方法,計算平方差和,值越小越匹配。
- cv2.TM_SQDIFF_NORMED:標準平方差匹配法,同樣計算平方差和,但是會對結果進行標準化處理。注意使用距離來計算被匹配圖像一定要小于原圖像
- cv2.TM_CCORR:相關性匹配法,#,值越大越匹配。
- cv2.TM_CCORR_NORMED:標準相關性匹配法,對結果進行標準化處理,返回值越大表示匹配程度越高,越小表示匹配程度越低。
該參數使用的是歸一化相關系數匹配模式,
返回的是匹配圖像和模板圖像之間的相關系數,取值范圍在 0 到 1 之間,1 表示完美匹配,0 表示沒有匹配。
- cv2.TM_CCOEFF:相關系數匹配法,計算兩個圖像的相關系數,值越大越匹配。
- cv2.TM_CCOEFF_NORMED:標準相關系數匹配法,對結果進行標準化處理。
?假設原圖如下:
需要找出的圖是西瓜
?
代碼:
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 讀取圖像
image = cv2.imread("./image/20240626-3.jpg") #多圖
grayImg = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
matchImg = cv2.imread("./image/20240626-4.jpg", 0) #匹配的圖# 模板匹配
result = cv2.matchTemplate(grayImg, matchImg, cv2.TM_CCORR_NORMED)
threshold = 0.999# 找到匹配的位置
loc = np.where(result >= threshold)# 繪制矩形
for pt in zip(*loc[::-1]): # 交換坐標順序cv2.rectangle(image, pt, (pt[0] + matchImg.shape[1], pt[1] + matchImg.shape[0]), (0, 0, 255), 2)# 顯示結果
# 使用 OpenCV 顯示
cv2.imshow('Matched Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 或者使用 Matplotlib 顯示(如果需要)
# plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # 注意:將 BGR 轉換為 RGB 以供 Matplotlib 顯示
# plt.show()
結果:
1、當閾值threshold = 0.999,因為我匹配圖就是這個截圖,哈哈哈哈
?
2、當閾值threshold = 0.98
3?、當閾值threshold = 0.9
?
?