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

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

1.1 Mat对象和ROI

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

1.1.1 创建一个明确的Mat对象

  • Mat对象的加深理解

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

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

在这里插入图片描述
其中,我们常用的构造函数,主要有以下几种:
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对象的说明:
  • 示例:
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();

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

猜你喜欢

转载自blog.csdn.net/weixin_43520503/article/details/129156752
今日推荐