【C++的OpenCV】第四课-OpenCV图像常用操作(一):Mat对象深化学习、灰度、ROI

news2024/11/29 2:38:37

我们开始图像处理的基本操作的了解

  • 一、图像对象本身的加深学习
    • 1.1 Mat对象和ROI
      • 1.1.1 创建一个明确的Mat对象
      • 1.1.2 感兴趣的区域ROI
  • 二、图像的灰度处理
    • 2.1 概念
    • 2.2 cvtColor()函数
    • 2.3 示例

一、图像对象本身的加深学习

1.1 Mat对象和ROI

    这是一个技术经验的浅尝,所以不是某个具体的函数,而是对前边某部分大家接触过的内容的加深和复习,帮助大家更深地进入视觉处理这个领域的学习。

1.1.1 创建一个明确的Mat对象

  • Mat对象的加深理解

    我们有多种方式从现实世界中获取数字图像:数码相机,扫描仪,计算机断层扫描和磁共振成像等等。在任何情况下,我们(人类)看到的都是图像。然而,当将其转换为数字设备时,我们记录的是图像中每个点的数值。

在这里插入图片描述
    例如在上述图像中,您可以看到汽车的镜像只不过是一个包含像素点所有强度值的矩阵。我们如何获取和存储像素值可能会根据我们的需要而有所不同,但最终,计算机世界内的所有图像可能会被减少到描述矩阵本身的数字矩阵和其他信息。OpenCV是一个计算机视觉库,其主要重点是处理和操纵这些信息。因此,您需要熟悉的第一件事是OpenCV如何存储和处理图像。
    所以可以简单的理解为,图像就是一个n维矩阵

  • Mat对象的构造函数的解读
    原文:Mat对象的多种构造函数原文地址

在这里插入图片描述
其中,我们常用的构造函数,主要有以下几种:
1、Mat (int rows, int cols, int type, const Scalar &s)

  • 参数解释:
//This is an overloaded member function, 
//provided for convenience. 
//It differs from the above function only in what argument(s) it accepts.
// 这是一个为了更加便捷而提供的重载成员函数,
//和上述构造函数的区别仅仅在于所接受的参数个数的不同

//Parameters  成员参数:
//rows:	一个2维数组的行数
//cols:	 一个2维数组的列数
//type:	这是一个重要的参数,关于这个参数的值(宏),解释放在下边,大家一定要引起重视:
	//原文:Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices,
		// or CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
	//翻译:该参数表示数组的类型(矩阵的类型),
		//由CV_8UC1...CV_64FC4来创建1~4通道的矩阵,
		//或者使用CV_8UC(n), ..., CV_64FC(n)来创建多通道的矩阵。
	/*
	CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
		其中,The number of bits per item为每个矩阵数字的位数
				(实则规定十进制数字的大小,这里需要大家对二进制转换10进制比较了解才可);
		Signed or Unsigned为是否有符号(数据的类型);
		The channel number为通道的个数
		Type Prefix为前缀
	例如:CV_8UC3意味着我们使用8位长的无符号字符类型,每个像素有三个通道。这是最多四个通道号预定义的。
	*/
//s:	一个用于初始化矩阵元素的初始化的可选值. 旨在在构造之后完成对所有矩阵元素的值设定为特定值的参数, 使用赋值操作来完成这个动作.
  • 备注:其变形cv::Mat::Mat(Size size,int type,const Scalar & s ) 中Size对象也是一种尺寸对象的表达,可以简单理解为长宽高组成的一个Size对象(当然对于复杂图像而言,理解方式没错,但是具体表述得在理解后自行变通)

2、Mat (int ndims, const int *sizes, int type, const Scalar &s)

  • 参数解释:
//ndims:维度
//sizes:是一个整型数组,且数组中的元素不可变,维度是n就有n个元素,
	//每个元素的大小表示每个维度上的尺寸。
//type: 同上
//s:同上
	/*
	例如:
    int sz[3] = {2,2,2};
    Mat L(3,sz, CV_8UC(1), Scalar::all(0));
    这个对象就是一个3维的,每个维度大小为2,且每一个维度8位无符号的图像
	*/

3、Mat (const Mat &m)

  • 参数解释:
// m:另外一个Mat对象,拷贝构造函数。

4、Mat (const Mat &m, const Rect &roi)

  • 参数解释:
// 这里涉及到一个非常重要的参数:
// roi:感兴趣的区域,其类型为Rect,这个类型的对象就是一个矩形对象(方框)。
	//当然,感兴趣的区域不一定是方形的(可以是圆的...等),注意融会贯通。

其他的构造函数只要搞懂上边四个,都可以融会贯通。

1.1.2 感兴趣的区域ROI

  • 什么是ROI:(region of intrest)感兴趣的区域,有什么用途?旨在图像上选择自己感兴趣的区域用于其他的操作。是一种灵活的技术。
  • 如何使用?
    其实在上边已经悄悄地给大家演示了一种方式:
// 利用Rect来完成对Mat对象上感兴趣部分的截取:
Mat (const Mat &m, const Rect &roi) // 就是利用这个构造函数即可,其余的方式在后续的实战中慢慢积累,但是基础很重要,了解本质即活学活用了。
  • 关于Rect对象的说明:
    • 原文网址:Rect类的解释
      在这里插入图片描述只需要理解,正方形即可。
  • 示例:
Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
	//其中Rect中的参数可以理解为x,y(正方形的起始点坐标【左上顶点】,两个10的含义),正方形区域的长宽(两个100的含义)
Mat E = A(Range::all(), Range(1,3)); // 利用矩阵行列也可以选择矩形区域,用的没有Rect多

二、图像的灰度处理

2.1 概念

  • 什么是灰度处理?
    以RGB色图片为例,使得三通道色相等(R=G=B)的处理手段称之为灰度处理,如果RGB是(0,0,0)为纯黑(0代表没有颜色,即每个通道都是黑的,所以最终是黑色的),如果是(255,255,255)就是白色(最亮)
  • 为什么进行灰度处理?
    一般图像处理默认采用灰度处理,因为彩色处理的难度和计算量非常大,且容易出错还耽误时间,在处理好后再转回彩色即可。

2.2 cvtColor()函数

  • 函数原型:

void cv::cvtColor	(	InputArray 	src,
						OutputArray 	dst,
						int 	code,
						int 	dstCn = 0 
					)	
  • 函数功能:图像的色彩空间转换格式,不仅仅局限于灰度转换,用途广泛。
  • 参数解释:
    • src : 原始图像
    • dst :处理后的图像
    • code :色彩空间的转换模式
    • dstCn :目标图像的通道数,默认为0(不改变不需要设置该值),如果是0表示自动沿用src的通道数
  • 关于code参数值的说明:其决定了色彩转换的模式,方式非常多,附原网址供参考:code参数值列表
    在这里插入图片描述红色框选的为将BGR图像进行灰度转换的参数,以下类似,大家根据实际情况进行选择即可。

2.3 示例

Mat img = imread("image.jpg");
Mat grey;
cvtColor(img, grey, COLOR_BGR2GRAY);
namedWindow("image", WINDOW_AUTOSIZE);
imshow("image", grey);
waitKey();

后续,我们继续学习。持续更新。

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

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

相关文章

什么是 CSAT?这份客户满意度流程指南请查收

什么是 CSAT?如何计算我的客户满意度分数?大中型公司应该熟悉这些术语。以下文章旨在教您有关客户满意度流程的所有内容 - 基本的CSAT概念、创建CSAT调查的好处、如何创建CSAT调查。配图来源: SaleSmartly(ss客服) 一、什么是 CSAT&#xff1…

算法笔记(十二)—— Manacher算法(回文子串)

计算字符串内的最大回文子串,常用的暴力扩散在应对长度为偶数的回文时会遇到一些问题。 Manacher基础:对字符串进行填充,在字符串开头结尾以及字符间填充‘#’,以来应对偶数回文时的问题。(这是采用暴力扩再除2&#x…

[黑马程序员SSM框架教程]03 spring核心概念

IOC/DI 书写现状:耦合度偏高 如图:传统书写代码左边业务层需要new一个对象进行业务实现。当数据层优化代码BookDaoImpl2就需要动业务层代码重新修改new的对象。导致代码耦合度偏高。 解决办法:使用对象,不要主动new对象&#xff…

kubernetes traefik ingress 安装部署以及使用和注意点

1、简介 Traefik 是一款 open-source 边缘路由器,可让您轻松地发布服务. 它接收来自您的系统请求,并找出负责处理它们的后端服务组件。 traefik 与众不同在于它能够自动发现适合您服务的配置。 当 Traefik 检查您的基础设施时,它会发现相关信…

Redisson实现分布式锁

目录Redisson简介Redisson实现分布式锁步骤引入依赖application.ymlRedisson 配置类Redisson分布式锁实现Redisson简介 Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,没有说“最好”)的编程语言之一。…

Matthew Ball:十多年后AR/VR为何依然发展缓慢?

2010年,Magic Leap和微软就开始研发AR技术,直到2012年Oculus才成立,AR/VR经过了13年左右的时间,虽然受到越来越多人关注,但发展依然缓慢。VR的主要应用场景还是游戏,但VR游戏只是游戏市场的一个分支&#x…

第七章.深度学习

第七章.深度学习 7.1 深度学习 深度学习是加深了层的深度神经网络。 1.加深层的好处 1).可以减少网络的参数数量 5*5的卷积运算示例: 重复两次3*3的卷积层示例: 图像说明: ①.一次5 * 5的卷积运算的区域可以由两次3 * 3的卷积运算抵消&a…

服务端开发Java之备战秋招面试篇1

在这个面试造火箭工作拧螺丝的时代背景下,感觉不是很好,不过还好也是拿到了还行的offer,准备去实习了,接下来就是边实习边准备秋招了,这半年把(技术栈八股文面经算法题项目)吃透,希望…

打破数据孤岛,Apache Doris 助力纵腾集团快速构建流批一体数仓架构|最佳实践

福建纵腾网络有限公司(简称“纵腾集团”)成立于 2009 年, 以“全球跨境电商基础设施服务商”为企业定位,聚焦跨境仓储与物流, 为全球跨境电商商户、出口贸易企业、出海品牌商提供海外仓储、商业专线物流、定制化物流等…

【C++】vector 模拟实现

vectorvector 容器vector 基本使用vector 定义库中各类接口的使用迭代器容量相关接口元素访问相关接口元素修改相关接口模拟实现 vector前期准备构造与析构赋值运算符重载迭代器相关容量相关元素访问相关元素的修改相关二维数组的创建对于自定义类型数据的测试vector 容器 C S…

Python实战之小说下载神器(二)整本小说下载:看小说不用这个程序,我实在替你感到可惜*(小说爱好者必备)

前言 这次的是一个系列内容给大家讲解一下何一步一步实现一个完整的实战项目案例系列之小说下载神器(二)(GUI界面化程序) 单章小说下载保存数据——整本小说下载 你有看小说“中毒”的经历嘛?小编多多少少还是爱看小说…

基于react+nodejs+mysql开发用户中心,用于项管理加入的项目的用户认证

基于reactnodejsmysql开发用户中心,用于项管理加入的项目的用户认证用户中心功能介绍页面截图后端采用架构user表projects表project_user表仓库地址用户中心功能介绍 用户中心项目,用于统一管理用户信息、登录、注册、鉴权等 功能如下: 用…

[qiankun]实战问题汇总

[qiankun]实战问题汇总ERROR SyntaxError: Cannot use import statement outside a module问题分析解决方案子应用命名问题问题分析解决方案jsonpFunction详细错误信息问题分析解决方案微应用的注册问题Uncaught Error: application cli5-beta6-test-name died in status LOADI…

2月,真的不要跳槽。

新年已经过去,马上就到金三银四跳槽季了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必…

Zebec官方辟谣“我们与Protradex没有任何关系”

近日,流支付协议Zebec Protocol在其官方推特上,发表了一个辟谣澄清声明。该条推特推文表示,“Zebec 与 Protradex 没有任何关系或产生关联。他们( Protradex )声称Zebec 生态正在支持他们,但这是错误的。随…

上海亚商投顾:沪指失守3300点 卫星导航概念全天强势

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪指数早间低开后震荡回升,沪指盘中一度翻红,随后又再度走低,创业板指午后跌近1%。…

基于GIS计算降雨侵蚀力R因子

一、数据来源介绍 (一)行政边界数据 本文所用到的河北唐山行政边界数据来源于中国科学院资源环境科学与数据中心(https://www.resdc.cn/Default.aspx)。 (二)降水量数据 本文所用到的降水量数据来源于国家…

【Java基础 下】 025 -- 阶段项目(斗地主)

目录 斗地主 一、斗地主游戏1 -- 准洗发(控制台版) 1、准备牌 2、洗牌 3、发牌 4、看牌 二、斗地主游戏2 -- 给牌排序①(利用序号进行排序) 2、洗牌 3、发牌 4、看牌 三、斗地主游戏2 -- 给牌排序②(给每一张牌计算价值…

118.Android 简单的分组列表(BaseRecyclerViewAdapterHelper)

//1.第一步 导入依赖库: //RecyclerView implementation com.android.support:recyclerview-v7:28.0.0 //RecyclerAdapter implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28 //2.第二步 新建SectionActivity页面: //manifest…

【第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式)】

第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式) 1.Spring是什么? ①Spring是一款主流的java EE 轻量级开源框架。 ②广义的Spring:Spring技术栈,Spring不再是一个单纯的应用框架&#x…