學習OpenCV:matchTemplate模板匹配原理分析

自己的一些理解,僅供參考。

模板匹配無法就是在目標圖中找出與模板圖最相似的座標 。

通過整體圖像的整體灰度值來判斷就是灰度匹配;

通過圖像的邊緣信息來判斷就是灰度匹配;

通過圖像的角點等特徵點來判斷就是特徵匹配。

模板匹配中,最重要的就是定義兩幅圖像的相似度,根據相似度的最值即可在目標圖中找到對應的座標。

定義兩幅圖片相似度需要根據圖片的實際情況選擇,OpenCV這裏提供了包含以下方法,MATLAB中還提供了一些其他方法。

差值平方和匹配 TM_SQDIFF
標準化差值平方和匹配 TM_SQDIFF_NORMED
相關性匹配 TM_CCORR
標準化相關匹配 TM_CCORR_NORMED
相關性係數匹配 TM_CCOEFF
標準相關性係數匹配 TM_CCOEFF_NORMED

 這裏簡單說明一下這幾個方法的區別,歡迎留言指正。

TM_SQDIFF:即爲SSD,得到結果其實爲不相似度,如果你在尋找精確或非常接近精確的匹配,使用SSD。它速度很快,而且它肯定會找到相似值的最小值。不具備光照不變性。對應的TM_SQDIFF_NORMED得到的結果的具體數學意義不知道是什麼,公式本身是可以大於1的,但實際試驗發現大於1的值會等於1。

y=kx+b,y爲輸出圖像,x爲輸入圖像,則斜率k爲對比度,截距b爲亮度。

TM_CCORR_NORMED:向量相乘公式a·b=x1x2+y1y2=|a||b|cosθ,把圖片當成向量,相似值則cosθ,在0到1之間,當兩個向量平行時cosθ=1,對應的當圖像整體乘於某個值時兩張圖像仍然爲相似,即可不用考慮斜率k。而TM_CCOEFF_NORMED則是爲了忽略截距b的影響,將向量平移到均值中,相乘的兩個向量爲與均值相減之後的向量。

(好難描述,將就一下。。。)

 這裏簡單介紹一下模板匹配過程中需要用到的其他擴展功能的思路,實現起來都比較簡單,這裏就不帖代碼了。

1、旋轉匹配:在建立模板的時候,設置好起始角度,終止角度,跨度,根據這些值對模板進行旋轉,可通過warpAffine依次生成各個角度的模板;在匹配過程中將目標圖與這些各個角度的模板進行匹配,選擇相似度最高時的角度。

2、金字塔:最重要的功能是爲了減少計算量。就是將一張大圖通過resize成比較小的圖,一般是依次長寬都除於2,在最高層進行模板匹配操作,得到匹配座標之後再從最高層依次映射到原圖中,在這映射過程中爲了提高精度,需要在匹配座標兩邊10個像素內繼續繼續匹配。注意金字塔層數不能選得太多,根據我經驗一般最高出層需應該大於10個像素。如果有旋轉操作一般在最高層確定好角度後在底層對角度就不進行匹配了。

3、形狀匹配:對模板用Canny提取模板邊緣,轉化爲0,1的二值化圖像;對目標圖同樣用Canny提取模板邊緣,另外增加一個膨脹係數增加適應性,轉化爲0,1的二值化圖像;運行matchTemplate,方法爲TM_CCORR,得到的相似度即爲模板邊緣圖在目標邊緣圖中的個數,處於模板邊緣圖的個數即可進行歸一化。最後即可通過選定的閾值構建連通域,確定各連通域中相似度最大的座標即爲我們要找的模板位置。當然可根據實際情況添加旋轉匹配的與金字塔的功能魯棒。

4、亞像素:選取最值旁邊的幾個像素座標,構建二元方程,選擇該工程中最值對應的亞像素座標即可。

對於非線性變換圖像、扭曲、光照不均等特性的圖像這些匹配方法可能無能爲力。Halcon大神Andreas Hofhauser有論文可參考

參考鏈接:

https://stackoverflow.com/questions/58158129/understanding-and-evaluating-template-matching-methods

https://blog.csdn.net/huixingshao/article/details/45560643

《機器視覺算法與應用(雙語版).pdf》第三章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章