图像模板匹配算法,opencv模板匹配算法
以前,我写过如何获得手指静脉的二值特征图像。Portal: opencv-python使用Gabor滤波器提取手指静脉区域的二值纹理特征。
然后这篇文章记录了我是怎么做特征模板匹配的。
匹配评分原理:
原理:根据上面的二值纹理特征提取方法,可以得到手指静脉纹理的二值。
纹理通过二值纹理特征提取注册图像的ROI和待认证图像的ROI,得到两幅纹理前景图像,然后计算两幅纹理前景图像的相交(重叠)像素与两幅纹理前景图像的并集像素的比值,即为两幅图像的匹配得分。
但是在匹配过程中,为了使模板的同类图片(同一张手指图片)在匹配中获得更高的分数,同时使其他类图片的分数(相对)更小。我设计了另一种基于像素比较的方法:利用模板与待认证图像的交集来比较前一个模板的非运算与待认证图像的交集。由公式表示:
尺寸匹配:
为了逐像素地比较ROI区域的二值特征,待匹配的输入图像必须具有与原始图像相同的尺寸。在opencv中,您可以采用:
DST=cv。Resize (src,(cols,rows),0,0,插值=cv。间_最近)。我选择了最近邻插值(cv。inter _ nearest)原因很简单:因为对比的图片都是0,255的二值图像,如果采用双线性插值,就会被计算出来。
开始匹配:
接下来,很简单。无非是bitwise_or()和bitwise_and()的和。由于图片中的像素值都是255,所以直接用img.sum()/255就可以知道图片中有多少个非零像素。在此发布我的代码和效果:
def bf_match(template,bf1): # template是模板,bf1是测试图像,它们都是二元特征(0或255)行,cols=template . shape inv _ template=cv . bitwise _ not(template)# PLT . im show(inv _ template);plt.show() bf1=cv.resize(bf1,(cols,rows),0,0,插值=cv。INTER _ NEAREST)and _ img=cv . bitwise _ and(template,BF1)# or _ img=cv . bitwise _ or(template,1)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 . im。
(感觉之前基于Gabor的二值特征提取还是太粗糙了!)
点个赞噢亲~
如何给HTML div的三个边添加边框