基于OpenCV的模板匹配算法探索与实践

目录

一、模板匹配能够做什么?

二、六种模板匹配算法解析

1、平方差匹配法method=TM_SQDIFF

2、归一化平方差匹配法method=TM_SQDIFF_NORMED

3、相关匹配法method=TM_CCORR

4、归一化相关匹配法method=TM_ CCORR_NORMED

5、系数匹配法method=TM_CCOEFF

6、化相关系数匹配法 method=TM_CCOEFF_NORMED

三、模板匹配案例应用

四、总结


一、模板匹配能够做什么?

模板匹配算法能够用于在图像或数据中查找与给定模板相匹配的部分。这种算法通过比较模板和图像或数据中的各个部分,寻找最相似的匹配项。在计算机视觉领域,模板匹配算法被广泛用于目标定位、跟踪和识别等任务。例如,在人脸识别中,可以使用模板匹配算法来比较一个人脸模板和一组候选人脸,以确定最相似的匹配项。除此之外,模板匹配算法还可以用于文本分析、物体识别等领域。

二、六种模板匹配算法解析

模板匹配函数如下:

cv2.matchTemplate(img, tpl, method) 

其中,各参数含义如下:

  • img:原始图像,即需要在其中查找模板的图像。
  • tpl:模板图像,即需要查找的图像模式。
  • method:指定模板匹配的方法,可以是以下几种方法之一。
1、平方差匹配法method=TM_SQDIFF

首先,其公式如下:

R(x,y) = \sum_{x{}',y{}'}^{}(T(x{}',y{}')-I(x+x{}',y+y{}'))^{2}

T为模板图像,I为匹配图像;在匹配图像的(x,y)位置,向右x’,向下y’ 框定识别区域。通过计算模板与图像区域的平方差来进行匹配,最好的匹配值为0,匹配越差,匹配值越大。

2、归一化平方差匹配法method=TM_SQDIFF_NORMED

公式如下:

R(x,y) = \frac{\sum_{x{}',y{}'}^{}(T(x{}',y{}')-I(x+x{}',y+y{}'))^{2}}{\sqrt{\sum_{x{}',y{}'}^{}T(x{}',y{}')^{2}\cdot \sum_{x{}',y{}'}^{}I(x+x{}',y+y{}'))^{2}}}

其中,R(x,y)表示原始图像中以(x,y)为中心的区域与模板的归一化平方差匹配程度。分母部分是对原始图像区域和模板图像的像素值进行归一化处理,使得匹配结果不受图像亮度和对比度的影响。

这种方法通过计算归一化的平方差来衡量原始图像与模板图像的相似性。最佳匹配结果为0,表示两个图像完全匹配。匹配越差,匹配值越大,但最大不会超过1。

3、相关匹配法method=TM_CCORR

公式如下:

R(x,y) = \sum_{x{}',y{}'}^{}(T(x{}',y{}')\cdot I(x+x{}',y+y{}'))

其中,R(x,y)表示原始图像中以(x,y)为中心的区域与模板的相关性。x'y'遍历模板图像的所有像素坐标。T(x',y')表示模板图像在(x',y')位置的像素值,I(x+x',y+y')表示原始图像在(x+x',y+y')位置的像素值。

这种方法通过计算模板和图像区域的内积来衡量它们的相似性。较大的值表示较好的匹配,而较小的值表示较差的匹配。最佳匹配位置在值最大的地方。

4、归一化相关匹配法method=TM_ CCORR_NORMED

公式如下:

R(x,y) = \frac{\sum_{x{}',y{}'}^{}(T(x{}',y{}')\cdot I(x+x{}',y+y{}'))}{\sqrt{\sum_{x{}',y{}'}^{}T(x{}',y{}')^{2}\cdot \sum_{x{}',y{}'}^{}I(x+x{}',y+y{}'))^{2}}}

其中,R(x,y)表示原始图像中以(x,y)为中心的区域与模板的归一化相关性。分母部分对模板图像和原始图像区域的像素值进行归一化处理。

这种方法通过计算归一化的相关性来衡量模板和图像的相似性。最佳匹配结果为1,表示两个图像完全匹配。匹配越差,匹配值越小,但不会小于-1。

5、系数匹配法method=TM_CCOEFF

公式如下:

R(x,y)=\sum_{x{}',y{}'}^{}(T{}'(x{}',y{}')\cdot I{}'(x+x{}',y+y{}'))

其中:

T{}'{(x{}',y{}')}=T{(x{}',y{}')}-1/(w\cdot h) \cdot \sum_{x{}'',y{}''}^{}T(x+x{}'',y+y{}'')

I{}'(x+x{}',y+y{}')=I(x+x{}',y+y{}')-1/(w\cdot h) \cdot \sum_{x{}'',y{}''}^{}I(x+x{}'',y+y{}'')

这种方法通过计算源图像与模板的归一化相关性来衡量它们的相似性。最佳匹配结果在值等于1处,表示完全匹配。匹配越差,匹配值越小,但不会小于-1。

6、化相关系数匹配法 method=TM_CCOEFF_NORMED

公式如下:

R(x,y)=\frac{\sum_{x{}',y{}'}^{}(T{}'(x{}',y{}')\cdot I{}'(x+x{}',y+y{}'))}{​{\sqrt{\sum_{x{}',y{}'}^{}T{}'(x{}',y{}')^{2}\cdot \sum_{x{}',y{}'}^{}I{}'(x+x{}',y+y{}'))^{2}}}}

这种方法是相关系数匹配法的归一化版本。它使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,并将结果归一化。通过计算归一化的相关性系数来衡量源图像与模板的相似性。最佳匹配结果为1,表示完美匹配。匹配越差,匹配值越小,但不会小于-1。

三、模板匹配案例应用

在日常生活中,可乐瓶是随处可见的,可以通过截取瓶上的包装名,通过模式匹配判断是否是同一品牌的可乐。

代码展示:

kele = cv2.imread('kele.png')
template = cv2.imread('template.png')

h,w = template.shape[:2]
res = cv2.matchTemplate(kele,template,cv2.TM_CCOEFF_NORMED) #cv2.minMoxLoc可以获歌妇阵中的及小值和最人值,以及盘小值的索引号和及人值的索引号
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)#最小值,最大值,最小值位置,最大值位置
top_left = max_loc
bottom_right = (top_left[1]+w,top_left[0]+h)
kele_template = cv2.rectangle(kele,top_left,bottom_right,(0,255,0),2)#绘制矩形
cv2.imshow('kelee',kele_template)
cv2.waitKey(10000)

本案例使用归一化相关匹配法进行模板匹配。

案例图像展示:

模板图像:

模板匹配结果展示:

四、总结

随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值