当前位置:   article > 正文

永兴的笔记-OpenCV-11模版匹配 (python)_min_val max_val

min_val max_val

在这里插入图片描述
一、什么是模版匹配?

  • 描述:模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。
  • 局限性:模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
  • 定义: 模板就是一副已知的小图像,而模板匹配就是在一副大图像中搜寻目标,已知该图中有要找的目标,且该目标同模板有相同的尺寸、方向和图像元素,通过一定的算法可以在图中找到目标,确定其坐标位置。

二、模版匹配实现原理(了解即可):

  • 相关法
    以8位灰度图像为例,模板T(m,n)叠放在被搜索图S(W,H)上平移,模板覆盖被搜索图的那块区域叫子图 ,i,j为子图左下角在被搜索图S上的坐标。可以用下式衡量T和 的相似性:
    在这里插入图片描述
    将其归一化,得模板匹配的相关系数:
    在这里插入图片描述
    当模板和子图一样时,相关系数R(i,j)=1,在被搜索图S中完成全部搜索后,找出R的最大值 ,其对应的子图 即为匹配目标。显然,用这种公式做图像匹配运算量最大、速度最慢。 [1]
  • 误差法
    误差法即衡量T和 的误差,其公式为:
    在这里插入图片描述
    其中E(i,j)为最小值处即为匹配目标。为提高计算速度,取一误差阈值 ,当E(i,j)> 时便停止该点的计算,继续计算下一点。
    模板越大,匹配速度越慢;模板越小,匹配速度越快。
  • 二次匹配误差算法
    二次匹配误差算法中匹配分两次进行。
    在这里插入图片描述
  • 在应用模板匹配法进行图像匹配时,应注意以下几点:
    • 归一化互相关注进行匹配,模板应在(M-P+1)×(N-Q+1)个参考位置上进行相关计算,计算量非常大,必要时可以采用序贯相似检验算法、幅度排序相关算法、FFT相关算法、分层搜索序贯判决等方法对其进行改进,以提高运算速度。
    • 模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
    • 若原图像中要匹配的目标只有部分可见,也无法完全完成匹配。

三、OpenCV实现:
1、基本模版匹配实现:

result = cv2.matchTemplate(image, templ, method, result=None, mask=None)

  • result是一个结果矩阵,假设待匹配图像为 I,宽高为(W,H),模板图像为 T,宽高为(w,h)。那么result的大小就为(W-w+1,H-h+1) 。 原因是因为,在匹配时,以模板大小的搜索框依次遍历整张图片时,每行需要遍历(W-w+1)次,每列需要遍历(H-h+1)。
    以下列矩阵为例:
    待匹配图像 I.Size(5,5),模板图像 T.Size(3,3)。以Size(3,3)的搜索框遍历图像I时,x方向需要遍历3次,y方向遍历3次。
    在这里插入图片描述
    多观察发现,归纳出result.Size(W-w+1,H-h+1)。
    T 代表模板图像,I 代表待匹配图像。
    x ,y 代表当前搜索框在 I 矩阵中左上角元素的坐标。
    x’ ,y’ 代表T和搜索框框出来的 I 的矩阵的元素坐标。
    如下图:以归一化相关系数匹配方法为例。
    此时搜索框左上角坐标(x,y)=(0,0)。
    在这里插入图片描述
    在这里插入图片描述
  • image: --运行搜索的图像。它必须是8位或32位浮点。
  • templ: –搜索的模板。(它必须不大于源图像并且具有相同的数据类型。)
  • result: –比较结果图。它必须是单通道32位浮点(If image is W \times H and templ is w \times h , then result is (W-w+1) \times (H-h+1) .)
  • method –指定比较方法的参数
method描述
CV_TM_SQDIFF平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_SQDIFF_NORMED相关匹配法:该方法采用乘法操作.。完全匹配会得到很大值,不匹配会得到一个很小值或0。
CV_TM_CCORR相关系数匹配法:1表示完美的匹配;-1表示最差的匹配,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳匹配位置在值最大处,值越小匹配结果越差。
CV_TM_CCORR_NORMED归一化平方差匹配法
CV_TM_CCOEFF归一化相关匹配法,与相关性匹配方法类似,最佳匹配位置也是在值最大处。
CV_TM_CCOEFF_NORMED归一化相关系数匹配法 , 该方法使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表示二者不相关。

数学原理(了解即可):

在这里插入图片描述
查找最大最小值:
min_val,max_val,min_indx,max_indx = cv2.minMaxLoc(src, mask=None)
参数:

  • src: 查找的图像
  • mask : 图像掩膜

返回值:

  • min_val :最小值
  • max_val :最大值
  • min_index: 最小值的索引
  • max_index: 最大值的索引

在给定的矩阵中寻找最大和最小值,并给出它们的位置。 该功能不适用于多通道阵列。 如果您需要在所有通道中查找最小或最大元素,要先将阵列重新解释为单通道。

import cv2 as cv

def template_demo():
    tpl = cv.imread("a.jpg") #匹配的模版
    target = cv.imread("first.jpg")  #原图像
    cv.imshow("template image",tpl)
    cv.imshow("target image",target)
    methods = [cv.TM_SQDIFF_NORMED,cv.TM_CCORR_NORMED,cv.TM_CCOEFF_NORMED]#各种匹配算法
    th,tw = tpl.shape[:2]#获取模板图像的高宽
    for md in methods:
        result = cv.matchTemplate(target,tpl,md)
        # result是我们各种算法下匹配后的图像
        
        #获取的是每种公式中计算出来的值,每个像素点都对应一个值
        min_val,max_val,min_loc,max_loc = cv.minMaxLoc(result)
        if md == cv.TM_SQDIFF_NORMED: #相关匹配法的左上角是最小值
            tl = min_loc    #tl是左上角点
        else:
            tl = max_loc
        br = (tl[0]+tw,tl[1]+th)    #右下点
        cv.rectangle(target,tl,br,(0,0,255),2)#画矩形
        cv.imshow("match-%s"%md,target)
if __name__ == "__main__":
    template_demo()
    cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
    cv.destroyAllWindows()  #销毁所有窗口
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在这里插入图片描述

练习题 11:
利用模版匹配,截取一本书的封面(最好是颜色鲜艳的),使用摄像头找到书本,并播放视频并显示框选框。(可以尝试在匹配前进行优化)

评论出你的答案。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/79049
推荐阅读
相关标签
  

闽ICP备14008679号