OpenCV與圖像處理學習十六——模闆比對
- 一、模闆比對介紹
- 二、代碼應用
一、模闆比對介紹
模闆比對是一種最原始、最基本的模式識别方法,研究某一特定目标的圖像位于圖像的什麼地方,進而對圖像進行定位。
在待檢測的圖像上,從左到右,從上到下計算模闆圖像與重疊子圖像的比對度,比對程度越大,兩者相同的可能性越大。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLyUlaONTWE50dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzkzM1QzNxUTM4IDMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、代碼應用
OpenCV中的函數:
參數如下所示:
- image:待搜尋的原圖,必須是灰階圖或4通道圖。
- templ:模闆圖像,必須不大于原圖像并具有相同的資料類型。
- method:表示計算比對程度的方法。
OpenCV與圖像處理學習十六——模闆比對一、模闆比對介紹二、代碼應用 TM_SQDIFF_NORMED是标準平方差比對,通過計算兩圖之間平方差來進行比對,最好比對為0,比對越差,比對值越大。
TM_CCORR_NORMED是标準相關性比對,采用模闆和圖像間的乘法操作,數越大表示比對程度越高,0表示最壞的比對效果,這種方法除了亮度線性變化對相似度計算的影響。
TM_CCOEFF_NORMED是标準相關性系數比對,兩圖減去各自的平均值之外,還要各自除以各自的方差。将模闆對其均值的相對值與圖像對其均值的相關值進行比對,1表示完美比對,-1表示糟糕的比對,0表示沒有任何相關性(随機序列)。
擷取相關性最大最小值及其位置的函數:
參數如下所示:
即傳回最大值及其位置、最小值及其位置。
看個例子:
# 模闆比對
import cv2
import numpy as np
def template_demo(tpl, target):
methods = [cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF_NORMED] # 3種模闆比對方法
th, tw = tpl.shape[:2]
for md in methods:
# print(md)
result = cv2.matchTemplate(target, tpl, md)
# print(result.shape)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
print(min_val, max_val, min_loc, max_loc)
# 找比對效果最好的位置,TM_SQDIFF_NORMED方法值越小越好,另外兩種越大越好
if md == cv2.TM_SQDIFF_NORMED:
tl = min_loc
else:
tl = max_loc
br = (tl[0] + tw, tl[1] + th) # br是矩形右下角的點的坐标
cv2.rectangle(target, tl, br, (0, 0, 255), 2)
cv2.namedWindow("match-" + np.str(md), cv2.WINDOW_NORMAL)
cv2.imshow("match-" + np.str(md), target)
tpl = cv2.imread("image/sample2.jpg")
print(tpl.shape)
target = cv2.imread("image/target1.jpg")
print(target.shape)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.namedWindow('template image', cv2.WINDOW_NORMAL)
cv2.imshow("template image", tpl)
cv2.namedWindow('target image', cv2.WINDOW_NORMAL)
cv2.imshow("target image", target)
template_demo(tpl, target)
cv2.waitKey(0)
cv2.destroyAllWindows()
模闆和待比對的圖如下所示:
三種比對方法的效果如下所示:
cv2.TM_SQDIFF_NORMED:
cv2.TM_CCORR_NORMED:
cv2.TM_CCOEFF_NORMED:
都是可以很好的比對上,但是這裡是比對度很高時的一個例子,如果模闆的比對度沒那麼高,這種方法的效果就會打折扣。