当前位置: 首页 > ds >正文

opencv 模板匹配

模板匹配

  • 1. 模板匹配
  • 2. 匹配方法(cv2.matchTemplate())
    • 2.1 平方差匹配(cv2.TM_SQDIFF)
    • 2.2 归一化平方差匹配(cv2.TM_SQDIFF_NORMED)
    • 2.3 相关匹配(cv2.TM_CCORR)
    • 2.4 归一化相关匹配(cv2.TM_CCORR_NORMED)
    • 2.5 相关系数匹配(cv2.TM_CCOEFF)
    • 2.6 归一化相关系数匹配(cv2.TM_CCOEFF_NORMED)

1. 模板匹配

模板匹配就是用模板图(通常是一个小图)在目标图像(通常是一个比模板图大的图片)中不断的滑动比较,通过某种比较方法来判断是否匹配成功。

在这里插入图片描述

2. 匹配方法(cv2.matchTemplate())

res=cv2.matchTemplate(image,templ,method)

参数说明:

  • image:原图像,这是一个灰度图像或彩色图像(在这种情况下,匹配将在每个通道上独立进行)。

  • templ:模板图像,也是灰度图像或与原图像相同通道数的彩色图像。

  • method:匹配方法,可以是以下之一:

    • cv2.TM_CCOEFF 相关系数匹配
    • cv2.TM_CCOEFF_NORMED 归一化相关系数匹配
    • cv2.TM_CCORR 相关匹配
    • cv2.TM_CCORR_NORMED 归一化相关匹配
    • cv2.TM_SQDIFF 平方差匹配
    • cv2.TM_SQDIFF_NORMED 归一化平方差匹配
    • 这些方法决定了如何度量模板图像与原图像子窗口之间的相似度。
  • 返回值res

    函数在完成图像模板匹配后返回一个结果矩阵这个矩阵的大小与原图像相同。矩阵的每个元素表示原图像中相应位置与模板图像匹配的相似度。

    匹配方法不同,返回矩阵的值的含义也会有所区别。以下是几种常用的匹配方法及其返回值含义:

    1. cv2.TM_SQDIFFcv2.TM_SQDIFF_NORMED

      返回值越接近0,表示匹配程度越好。最小值对应的最佳匹配位置。

    2. cv2.TM_CCORRcv2.TM_CCORR_NORMED

      返回值越大,表示匹配程度越好。最大值对应的最佳匹配位置。

    3. cv2.TM_CCOEFFcv2.TM_CCOEFF_NORMED

      返回值越大,表示匹配程度越好。最大值对应的最佳匹配位置。

2.1 平方差匹配(cv2.TM_SQDIFF)

以模板图与目标图所对应的像素值使用平方差公式来计算,其结果越小,代表匹配程度越高,计算过程举例如下。

注意:模板匹配过程皆不需要边缘填充,直接从目标图像的左上角开始计算。
在这里插入图片描述
绘制轮廓:
找的目标图像中匹配程度最高的点,我们可以设定一个匹配阈值来筛选出多个匹配程度高的区域。

loc=np.where(array > 0.8) #loc包含array中所有大于0.8的元素索引的数组

*zip(loc)
代码如下:

'''平方差匹配'''img=cv2.imread("../15day4.10/src/game.png")temp=cv2.imread("../15day4.10/src/temp.png")h,w,c=temp.shape#获取匹配后的相似值cv2.matchTemplate(),# 平方差匹配cv2.TM_SQDIFF 值越小越相似res=cv2.matchTemplate(img,temp,cv2.TM_SQDIFF)#设置阈值筛选出非常相似的子图threshold=2000000# 找到满足要求的坐标loc=np.where(res<threshold)#用一个矩形框圈出符合要求的图像for el in zip(*loc):cv2.rectangle(img,el[::-1],(el[1]+w,el[0]+h),(255,0,255),2)cv2.imshow("img",img)cv2.imshow("temp",temp)cv2.waitKey(0)

在这里插入图片描述

2.2 归一化平方差匹配(cv2.TM_SQDIFF_NORMED)

与平方差匹配类似,只不过需要将值统一到0到1,计算结果越小,代表匹配程度越高,计算过程举例如下。
在这里插入图片描述
代码如下:

    '''归一化平方差匹配'''img=cv2.imread("../15day4.10/src/game.png")temp=cv2.imread("../15day4.10/src/temp.png")h,w,c=temp.shape#获取匹配后的相似值cv2.matchTemplate(),# 归一化平方差匹配cv2.TM_SQDIFF——MORMED 值越小越相似res=cv2.matchTemplate(img,temp,cv2.TM_SQDIFF_NORMED)#设置阈值筛选出非常相似的子图threshold=0.3# 找到满足要求的坐标loc=np.where(res<threshold)#用一个矩形框圈出符合要求的图像for el in zip(*loc):cv2.rectangle(img,el[::-1],(el[1]+w,el[0]+h),(255,0,255),2)cv2.imshow("img",img)cv2.imshow("temp",temp)cv2.waitKey(0)

在这里插入图片描述

2.3 相关匹配(cv2.TM_CCORR)

使用对应像素的乘积进行匹配 ,乘积的结果越大其匹配程度越高,计算过程举例如下。
在这里插入图片描述
代码如下:

'''相关匹配'''img=cv2.imread("../15day4.10/src/game.png")temp=cv2.imread("../15day4.10/src/temp.png")h,w,c=temp.shape#获取匹配后的相似值cv2.matchTemplate(),# 相关匹配cv2.TM_CCORR 值越大越相似res=cv2.matchTemplate(img,temp,cv2.TM_CCORR)#设置阈值筛选出非常相似的子图threshold=7300000# 找到满足要求的坐标loc=np.where(res>threshold)#用一个矩形框圈出符合要求的图像for el in zip(*loc):cv2.rectangle(img,el[::-1],(el[1]+w,el[0]+h),(255,0,255),1)cv2.imshow("img",img)cv2.imshow("temp",temp)cv2.waitKey(0)

在这里插入图片描述

注意:

  • 越大越好的话,如果原图有一片区域为白色那么久会被匹配上

2.4 归一化相关匹配(cv2.TM_CCORR_NORMED)

与相关匹配类似,只不过是将其值统一到0到1之间,值越大,代表匹配程度越高,计算过程举例如下
在这里插入图片描述
代码如下:

'''归一化相关匹配'''img=cv2.imread("../15day4.10/src/game.png")temp=cv2.imread("../15day4.10/src/temp.png")h,w,c=temp.shape#获取匹配后的相似值cv2.matchTemplate(),# 相关匹配cv2.TM_CCORR_NORMDE 值越大越相似res=cv2.matchTemplate(img,temp,cv2.TM_CCORR_NORMED)#设置阈值筛选出非常相似的子图threshold=0.9# 找到满足要求的坐标loc=np.where(res>threshold)#用一个矩形框圈出符合要求的图像for el in zip(*loc):cv2.rectangle(img,el[::-1],(el[1]+w,el[0]+h),(255,0,255),1)cv2.imshow("img",img)cv2.imshow("temp",temp)cv2.waitKey(0)

在这里插入图片描述

2.5 相关系数匹配(cv2.TM_CCOEFF)

需要先计算模板与目标图像的均值,然后通过每个像素与均值之间的差的乘积再求和来表示其匹配程度,越大越匹配,计算过程举例如下。
在这里插入图片描述
代码如下:

'''相关系数匹配'''img=cv2.imread("../15day4.10/src/game.png")temp=cv2.imread("../15day4.10/src/temp.png")h,w,c=temp.shape#获取匹配后的相似值cv2.matchTemplate(),# 相关系数匹配cv2.TM_CCOEFF 值越大越相似res=cv2.matchTemplate(img,temp,cv2.TM_CCOEFF)#设置阈值筛选出非常相似的子图threshold=3000000# 找到满足要求的坐标loc=np.where(res>threshold)#用一个矩形框圈出符合要求的图像for el in zip(*loc):cv2.rectangle(img,el[::-1],(el[1]+w,el[0]+h),(255,0,255),1)cv2.imshow("img",img)cv2.imshow("temp",temp)cv2.waitKey(0)

在这里插入图片描述

2.6 归一化相关系数匹配(cv2.TM_CCOEFF_NORMED)

也是将相关系数匹配的结果统一到0到1之间,值越接近1代表匹配程度越高,计算过程举例如下。
在这里插入图片描述
代码如下:

'''归一化相关系数匹配'''img=cv2.imread("../15day4.10/src/game.png")temp=cv2.imread("../15day4.10/src/temp.png")h,w,c=temp.shape#获取匹配后的相似值cv2.matchTemplate(),# 相关系数匹配cv2.TM_CCOEFF_NORMED 值越大越相似res=cv2.matchTemplate(img,temp,cv2.TM_CCOEFF_NORMED)#设置阈值筛选出非常相似的子图threshold=0.8# 找到满足要求的坐标loc=np.where(res>threshold)#用一个矩形框圈出符合要求的图像for el in zip(*loc):cv2.rectangle(img,el[::-1],(el[1]+w,el[0]+h),(255,0,255),1)cv2.imshow("img",img)cv2.imshow("temp",temp)cv2.waitKey(0)

在这里插入图片描述

http://www.xdnf.cn/news/2993.html

相关文章:

  • [USACO08DEC] Hay For Sale S Java
  • React Native 太慢:kotlin-gradle-plugin-2.0.21-gradle76.jar 下载太慢
  • Code Complete代码大全20年纪念版附录书籍等
  • 归并排序排序总结
  • 某高端制造企业知识中枢升级,基于悦数 Graph RAG 打造工业级「故障排查最强大脑」
  • OceanBase数据库-学习笔记5-用户
  • 《系统分析师-第三阶段—总结(七)》
  • C++入门(缺省参数/函数/引用)
  • 组件轮播与样式结构重用实验
  • Linux《进程概念(中)》
  • 在Arduino U8g2库中显示中文的方法
  • 「Mac畅玩AIGC与多模态06」开发篇02 - 开发第一个知识库问答应用
  • 电流探头的创新应用与霍尔效应原理
  • word文档插入公式后行距变大怎么办?
  • 大模型入门
  • 码蹄集——进制输出、求最大公约数、最小公倍数
  • 【时时三省】(C语言基础)循环结构程序设计习题2
  • 如何从大规模点集中筛选出距离不小于指定值的点
  • C语言-指针(一)
  • 【网络编程】协议和分层
  • 解决leensa无法使用的办法:平替教程
  • 编译原理:由浅入深从语法树到文法类型
  • 使用Python对接StockTV印度股票数据源的详细教程
  • MiniLLM:大型语言模型的知识蒸馏
  • InnoDB对LRU算法的优化
  • 哪些CAD看图软件适合初学者使用?
  • Jackson 使用方法详解
  • Starrocks导入数据时报错too many versions
  • 网络安全之红队LLM的大模型自动化越狱
  • RAG当知识库非常大导致大语言模型不准确,该如何处理