opencv3 模板匹配与直方图

news2024/11/29 2:49:06

模板匹配

尽量加上归一化操作

像素差值计算,模板在原图上滑动

① 模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度(例如值127与值190的区别),这个差别程度的计算方法在opencv里有6种,然后将每次计算的结果放入一个矩阵里,作为结果输出。

② 假如原图形是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)。
因为是类似于卷积
他5行的 你拿4行的去卷 只能卷2次 5-4+1 = 2

③ 模板匹配计算方式6种方式 ( 用归一化后的方式更好一些 ):

  • TM_SQDIFF:计算平方不同,计算出来的值越小,越相关。
  • TM_CCORR:计算相关性,计算出来的值越大,越相关。
  • TM_CCOEFF:计算相关系数,计算出来的值越大,越相关。
  • TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关。
  • TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关。
  • TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关。
methods = ['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR',
          'cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF) 可以拿标号数字表示不同方法
print(res.shape) # 返回的矩阵大小 (A-a+1)x(B-b+1)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res) # 返回模板匹配后最小值、最大值的位置   
print(min_val) # cv2.TM_SQDIFF方法中,越小的值表示像素点的差异越小
print(max_val)
print(min_loc) # 当获得最小值对应的模板左上角的位置,加上模板自身的长、宽,可以在原图像中画出最匹配的区域
print(max_loc)

多模板匹配

img_rgb = cv2.imread('01_Picture/14_Mario.jpg')
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
print('img_gray.shape:',img_gray.shape)
template = cv2.imread('01_Picture/15_Mario_coin.jpg',0)
print('template.shape:',template.shape)
h, w = template.shape[:2]

# res 是 result 的简称
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) # res 是返回每一个小块窗口得到的结果值
print('res.shape:',res.shape)
threshold = 0.8

# 取匹配程度大于 80% 的坐标
loc = np.where(res >= threshold) # np.where 使得返回 res 矩阵中值大于 0.8 的索引,即坐标
print('type(loc):',type(loc)) # loc 为元组类型
print('len(loc):',len(loc))  # loc 元组有两个值
print('len(loc[0]):',len(loc[0]),'len(loc[1]):',len(loc[1]))   # loc 元组每个值 120 个元素
print('type(loc[0]):',type(loc[0]),'type(loc[1]):',type(loc[1])) # loc 元组每个值的类型为 numpy.array 
print("loc[::-1]:",loc[::-1]) # loc[::-1] 表示顺序取反,即第二个 numpy.array 放在第一个 numpy.array 前面     

i = 0
# zip函数为打包为元组的列表,例 a = [1,2,3] b = [4,5,6] zip(a,b)[(1, 4), (2, 5), (3, 6)]    
for pt in zip(*loc[::-1]): # 当用 *b 作为传入参数时, b 可以为列表、元组、集合,zip使得元组中两个 numpy.array 进行配对   
    bottom_right = (pt[0] + w, pt[1] + h)
    cv2.rectangle(img_rgb, pt, bottom_right, (0,0,255),2)
    i = i + 1
print('i:',i)

cv2.imshow('img_rgb',img_rgb)
cv2.waitKey(0)

直方图

① 图像直方图是把图像变为灰度图,分成一个一个像素点的值进行统计,如下图左所示。

② 直方图统计函数 cv2.calcHist(images,channels,mask,histSize,ranges)

  • images:原图像的图像格式为 uint8 或 float32。当传入函数时应该用中括号 [] 括来传入,例如[img]
  • channels:同样用中括号来传入,它会告诉函数统幅的哪幅灰度图的直方图。如果传入的图像是灰度图它的值就是 [0],如果是彩色图像,那么传入的参数可以是 [0]、[1]、[2],它们分别对应着 B、G、R 通道,每个通道的图像都是灰度图。
  • mask:掩模图像。统计整幅图像的直方图时就把它设为 None。但是如果你想统计图像的某一部分区域的直方图的,你就制作一个掩模图像并使用它。
  • histSize:BIN 的数目。也应用中括号括来。 相当于x轴坐标的数目
  • ranges: 统计的像素值范围,常为 [0-256]。 每个x轴上坐标数值的范围
img = cv2.imread('01_Picture/01_Cat.jpg',0) # 0 表示灰度图
print((img.ravel()).shape)
histr = cv2.calcHist([img],[0],None,[256],[0,256])


plt.hist(img.ravel(),256) # img.ravel()将 img 拉成一维数组
plt.show()



img = cv2.imread('01_Picture/01_Cat.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    print(histr.shape)
    plt.plot(histr,color=col)
    plt.xlim([0,256])

掩码

相当于截取
在这里插入图片描述

img = cv2.imread('01_Picture/01_Cat.jpg',0)
cv_show(img,'img')
print(img.shape[:2])
mask = np.zeros(img.shape[:2],np.uint8)
print(mask.shape)
mask[100:300,100:400] = 255  需要保留的地方
cv_show(mask,'mask')
masked_img = cv2.bitwise_and(img,img,mask=mask) # 与操作
cv_show(masked_img,'masked_img')

图像掩码直方图

在这里插入图片描述
在这里插入图片描述

equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()

在这里插入图片描述
更亮更显眼

自适应直方图均衡

分模块均衡,可能比全局更靠谱
需要衡量

img = cv2.imread('01_Picture/16_Clahe.jpg',0)
clahe = cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8)) # 自适应均衡化方法生成出来    
res_clahe = clahe.apply(img) # 方法应用到输入图片当中
res = np.hstack((img,equ,res_clahe))
cv_show(res,'res')

① 如上图所示,直方图均衡化,人脸石膏本来有一些特征,可能由于直方图均衡导致丢失一些细节。所以可能切分成几个小块,局部做直方图均衡化,会比较好。

② 切分成几个小块之后,可能会导致一个现象,每个格子都会产生一个边界,opencv是对每个格子的边界进行线性插值处理。

③ 直方图均衡化函数:cv2.createCLAHE(clipLimit,tileGridSize)

  • clipLimit 颜色对比度的阈值。
  • titleGridSize 进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/597575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NVM-Nodejs多版本管理工具

NVM:🔎:下载点我 下载含有 setup.exe的 下载完成之后修改一下settings.txt 文件,在原有的基础上直接加入这些配置 root: D:\nvm path: D:\nvm\nodejs node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors…

(转载)多种群遗传算法的函数优化算法(matlab实现)

以下内容大部分来源于《MATLAB智能算法30个案例分析》,仅为学习交流所用。 1 理论基础 1.1 遗传算法早熟问题 遗传算法是一种借鉴生物界自然选择和进化机制发展起来的高度并行、随机、自适应的全局优化概率搜索算法。由于优化时不依赖于梯度,具有很强…

vue可视化大屏教程

在我们日常生活中,经常会看到各式各样的大屏,其中有一部分是传统的数据大屏,如工业监控大屏、环保监测大屏等。这些大屏的主要作用是展示信息,让用户快速获取信息,避免用户在阅读时产生视觉疲劳。还有一部分是智能的可…

建筑七大员有哪些发证部门?证书有什么区别?

建筑七大员是指建筑施工企业关键技术岗位,七大员分别是 施工员 质量员 标准员 材料员 机械员 劳务员 资料员 建筑七大员,常见的发证单位有住房和成乡建设厅和中国建设教育协会两个部门发证,但是大家还是要考住房和城乡建设厅的,建…

CANoe中如何仿真报文的CRC和Counter,告诉你三种方法皆可实现

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 📘前言 🍅 作为网络测试,有些测试场景总线中的其它节点进行仿真,因为…

SREWorks v1.5 版本发布 | 基于实时作业平台的日志聚类开源

在经过v1.0~v1.4四个版本迭代后,SREWorks的核心底座已经表现出极高的稳定性和成熟性。在v1.5版本中,SREWorks开发团队在核心底座上,进行了较多的数智化能力迭代。同时,在数智能力迭代过程中,我们也维持着与SREWorks用户…

5.2.4 IP数据报(二)分析Wireshark捕获的数据帧

5.2.4 IP数据报(二)分析Wireshark捕获的数据帧 为了更好的理解IP数据报的格式,我们通过一个实例学习IP数据报的格式 例:使用数据报捕获工具Wireshark采集我自己主机传输的一条报文,其中有个数据帧的内容如图所示&…

凝心聚力,共创未来 | 2023 开放原子全球开源峰会 OpenCloudOS 社区年会即将启幕

近年来,随着云原生技术的不断发展,催生出越来越多的新场景。作为企业 IT 系统的底层技术,其操作系统所面临的问题也变得越来越复杂。面对云原生等新技术对操作系统提出的新挑战、新要求,如何凝聚生态合作伙伴的优势力量&#xff0…

AI|用过的AI工具都给你整理好了

AI|用过的AI工具都给你整理好了 最近两周冷静下来了,而且个人状况因为二阳有所影响,没有过多关注这些AI工具;前两天给公司伙伴分享的契机,整理了一下这两个月用过的一些AI工具,部分是日常工作也在使用的&a…

展望开源产业与数字经济未来|2023 开放原子全球开源峰会开源创新理论与实践分论坛即将启幕

开源创新社会实践催生伟大的理论,也需要伟大理论的指导。在这个数字化和信息化高速发展的时代,开源技术已经成为推动科技进步和创新的关键力量,仍在不断创新迭代的开源理论及其实践更是深刻影响着与开源行业深度绑定的数字经济的未来发展。 6…

如何将多张图片分别生成二维码?图片批量建码怎么做?

当我们想要将图片生成二维码时,一般会使用二维码生成器(免费在线二维码生成器-二维码在线制作-音视频二维码在线生成工具-机智熊二维码)来操作,只需要上传图片就可以一键生成二维码,操作非常的简单快捷。那么当我们需要…

1167 Cartesian Tree(37行代码+详细注释)

分数 30 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 A Cartesian tree is a binary tree constructed from a sequence of distinct numbers. The tree is heap-ordered, and an inorder traversal returns the original sequence. For example, given the sequence …

火山引擎DataLeap的Catalog系统搜索实践 (二):整体架构

整体架构 火山引擎DataLeap的Catalog搜索系统使用了开源的搜索引擎Elasticsearch进行基础的文档检索(Recall阶段),因此各种资产元数据会被存放到Elasticsearch中。整个系统包括4个主要的数据流程: 实时导入。资产元数据变更时相应…

华为路由器 IPSec VPN 配置

需求&#xff1a; 通过 IPSecVPN 实现上海与成都内网互通 拓扑图如下&#xff1a; 一、首先完成网络配置 1、R1 路由器设置 <Huawei>sys [Huawei]sys R1 [R1]un in en# 开启DHCP [R1]dhcp enable# 设置内网接口 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip addr 10.…

基于Springboot+Vue的校园招聘系统(进阶版)

本项目是一年前写的一个项目的升级版&#xff0c;因为某些原因将它作了一个升级改进&#xff0c; 好多兄弟来问有没有演示&#xff0c;现在先来写个说明&#xff01;&#xff01;&#xff01; 目录 一. &#x1f981; 前言二. &#x1f981; 开源代码与组件使用情况说明三. &am…

工作笔记-volta,package打包,

第一个 &#xff1a;前端项目启动错误 今天写前端工程的时候&#xff0c;运行了npm run dev&#xff0c;结果出现以下问题&#xff0c; 先认为是node版本原因&#xff0c;我的是14&#xff0c;同事说要切换到12&#xff0c;于是切到了12&#xff0c; 用到了volta , 安装和使用…

大咖云集共话AIGC,亚马逊云科技中国峰会亮点抢先看

充满想象的AIGC时代&#xff0c;企业如何抓住机遇实现双效提升&#xff1f;要说2023年科技圈顶流话题&#xff0c;非AIGC&#xff08;AI-generated Content&#xff0c;人工智能生成内容&#xff09;莫属。当前&#xff0c;以GPT模型为代表的AIGC正在持续渗透各行各业&#xff…

信道的数学模型

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 信道的数学模型广义…

OpenMMLab-AI实战营第二期-课程笔记-Class 1:开营仪式OpenMMLab概述

Class 1&#xff1a;开营仪式&OpenMMLab概述 文章目录 Class 1&#xff1a;开营仪式&OpenMMLab概述开营仪式OpenMMLab 简介why&#xff1f;when&#xff1f;what&#xff1f;for who&#xff1f;OpenMMLab 总体框架 二十分钟入门计算机视觉开源神器OpenMMLabOpenMMLab概…

SQL审核工具Yearning搭建及使用

一、背景 实际的业务场景中&#xff0c;我们难免会直接对生产库的数据进行修改。很多朋友都是发sql给运维&#xff0c;然后运维执行。过程不可控&#xff0c;出错几率很大。 而且没有审核&#xff0c;不知道提交的具体是什么sql&#xff0c;极有可能是删库跑路的sql&#xff0…