opencv-python 二值图像的模板匹配实现
之前寫過如何獲得一個指靜脈的二值化特征圖像,傳送門:opencv-python 用Gabor濾波器實現指靜脈血管區域二值化紋理特征提取
然后這篇文章記錄我是如何來做特征模板匹配的。
匹配評分原理:
原理:根據上述二值紋理特征提取方法,獲取手指靜脈紋路的二值
紋理圖像將已注冊圖像的 ROI 區域與待認證圖片的 ROI 區域均采用二值紋理特征提取方法獲得兩張紋理前景圖像,然后計算兩張紋理前景圖像的交集(重疊)像素點數與兩張紋理前景圖像的并集像素點數之比,這個比值即為兩張圖像的匹配分數。
但是在匹配過程中,為了使得模板同類圖片(同一手指圖片)在匹配中得到更高的分數,同時讓其他類圖片的分數(相對)更小。我自己設計了基于像素對比的另外一種方法:用模板和待認證圖片的交集比上模板的非運算和待認證圖片的交集。用式子表示為:
?
尺寸匹配:
要對得到的ROI區域二值特征進行逐個像素的比對,必須使得輸入的待匹配圖片和原來的圖像尺寸一致。在opencv中,可以采用:
Dst=cv.resize(Src,(cols,rows),0,0,interpolation=cv.INTER_NEAREST)我選擇的是最近鄰插值法(cv.INTER_NEAREST),原因很簡單:因為參與對比的圖片都是0,255的二值圖像,如果采用雙線性插值法,將會計算出其他的像素值,這不便于后期的處理。
開始匹配:
接下來就很簡單了,無非是bitwise_or()和bitwise_and()和,由于圖片中的像素值都是255,直接用 img.sum()/255就可以知道圖片里面有多少個非零像素了。這里貼一下我的代碼和效果:
def bf_match(template,bf1): # template is template,bf1 is the test image,they are both binary feature(0 or 255)rows,cols=template.shapeinv_template=cv.bitwise_not(template)#plt.imshow(inv_template);plt.show()bf1=cv.resize(bf1,(cols,rows),0,0,interpolation=cv.INTER_NEAREST)and_img=cv.bitwise_and(template,bf1)#or_img=cv.bitwise_or(template,bf1)and_inv_img=cv.bitwise_and(inv_template,bf1)#result=result_img.sum()/or_img.sum()result=and_img.sum()/and_inv_img.sum()plt.imshow(and_img)plt.show()return result效果如下:
?(感覺之前基于Gabor的二值特征提取還是做的太粗糙了!!)
?
點個贊噢親~
?
總結
以上是生活随笔為你收集整理的opencv-python 二值图像的模板匹配实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AppInventor学习笔记:幸运抽奖
- 下一篇: 中国医药商业市场深度分析与十四五发展机遇