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

【模板匹配】图像处理(OpenCV)-part10

19.1模板匹配

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

不会有边缘填充

类似卷积滑动比较挨个比较象素

返回结果大小是:目标图大小-模板图大小+1。

19.2 匹配方法

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

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

19.2.1 平方差匹配

cv2.TM_SQDIFF

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

注意:模板匹配过程皆不需要边缘填充,直接从目标图像的左上角开始计算。

19.2.2 归一化平方差匹配

cv2.TM_SQDIFF_NORMED

与平方差匹配类似,只不过需要将值统一到0到1,计算结果越小,代表匹配程度越高,计算过程举例如下。

19.2.3 相关匹配

cv2.TM_CCORR

使用对应像素的乘积进行匹配,乘积的结果越大其匹配程度越高,计算过程举例如下。

19.2.4 归一化相关匹配

cv2.TM_CCORR_NORMED

与相关匹配类似,只不过是将其值统一到0到1之间,值越大,代表匹配程度越高,计算过程举例如下。

19.2.5 相关系数匹配

cv2.TM_CCOEFF

需要先计算模板与目标图像的均值,然后通过每个像素与均值之间的差的乘积再求和来表示其匹配程度,1表示完美的匹配,-1表示最差的匹配,计算过程举例如下。

19.2.6 归一化相关系数匹配

cv2.TM_CCOEFF_NORMED

也是将相关系数匹配的结果统一到0到1之间,值越接近1代表匹配程度越高,计算过程举例如下。

19.3 绘制轮廓

找的目标图像中匹配程度最高的点,我们可以设定一个匹配阈值来筛选出多个匹配程度高的区域。

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

np.where(condition) 是 NumPy 的一个函数,当条件为真时,返回满足条件的元素的索引。

  • zip(*loc)

    • *loc 是解包操作,将 loc 中的多个数组拆开,作为单独的参数传递给 zip

    • zip 将这些数组按元素一一配对,生成一个迭代器,每个元素是一个元组,表示一个坐标点。

x=list([[1,2,3,4,3],[23,4,2,4,2]])
print(list(zip(*x)))#[(1, 23), (2, 4), (3, 2), (4, 4), (3, 2)]
import cv2 as cv
import numpy as np#读图
img = cv.imread('images/huoyingrenzhe.jpg')
temp = cv.imread('images/zhipai.jpg')
#转灰度
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
temp_gray = cv.cvtColor(temp, cv.COLOR_BGR2GRAY)
#模板匹配,拿到匹配结果,返回匹配程度矩阵
res = cv.matchTemplate(img_gray, temp_gray, cv.TM_CCOEFF_NORMED)
#设置阈值,使用np.where()获取符合条件的坐标
threshold = 0.8
#得到[[y1,y2,y3...],[x1,x2,x3...]]
loc = np.where(res >= threshold)
h,w = temp.shape[:2]
#解包
for pt in zip(*loc[::-1]):cv.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

注意得到[[y1,y2,y3...],[x1,x2,x3...]]这样的返回值,因为先返回行索引再返回列索引

相关文章:

  • 学习海康VisionMaster之卡尺工具
  • 操作系统学习笔记
  • Representation Flow for Action Recognition论文笔记
  • 破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级 AI 原生时代
  • CSS清楚默认样式
  • CSS外边距合并现象
  • [架构之美]Ubuntu源码部署APISIX全流程详解(含避坑指南)
  • C++学习:六个月从基础到就业——C++学习之旅:STL迭代器系统
  • C++回顾 day3
  • 一些确保 iPaaS 集成平台与现有系统安全集成的方法
  • 深入剖析TCP协议(内容一):从OSI与TCP/IP网络模型到三次握手、四次挥手、状态管理、性能优化及Linux内核源码实现的全面技术指南
  • On the Biology of a Large Language Model——Claude团队的模型理解文章【论文阅读笔记】其一CLT与LLM知识推理
  • 初阶数据结构--排序算法(全解析!!!)
  • 开关电源LM5160-Q1 在 Fly-Buck 电路中的硬件设计与 PCB Layout 优化
  • OpenCV 图形API(53)颜色空间转换-----将 RGB 图像转换为灰度图像函数RGB2Gray()
  • HTML与Web 性能优化:构建高速响应的现代网站
  • 从物理到预测:数据驱动的深度学习的结构化探索及AI推理
  • vscode如何多行同时编辑,vscode快速选中多行快捷键
  • 从YOLOv5到YOLOv11,改进有多大?
  • 阻塞队列的介绍和简单实现——多线程编程简单案例[多线程编程篇(4)]
  • 国家发改委:将开展市场准入壁垒清理整治行动
  • 温氏股份一季度归母净利润20.01亿元,同比扭亏为盈
  • 上海常务副市长:持续提升跨境投融资便利化水平,稳步扩大金融领域的制度型开放
  • 港澳航天员最早2026年飞天
  • 电商平台全面取消“仅退款”:电商反内卷一大步,行业回归良性竞争
  • 日媒:日本公明党党首将访华,并携带石破茂亲笔信