基础图像容器 Mat

一、Mat简介

Mat是一个类,有两个数据部分组成:矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值得矩阵的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵的尺寸大数个数量级。所以通常复制矩阵只是复制矩阵头和矩阵指针,而不复制矩阵,但一般情况不要进行图像的复制,会降低程序运行速度。

Mat A, c;
A = imread("1.jpg", CV_IMAGE_COLOR); //在这里为矩阵开辟内存
Mat B(A); //使用拷贝构造函数进行复制
C = A; //赋值运算

以上A和C指向同一个矩阵,改变一个,另一个也会改变

Mat F = A.clone(); //复制一个A存到F里
Mat G;
A.copyTo(G); //将A复制给G

复制矩阵头、矩阵指针和矩阵,改变一个,另一个不变

二、像素值得储存方法

存储像素值需要指定颜色空间和数据类型。颜色空间,是对一个给定的颜色,如何组合颜色元素已对其编码。
最简单的颜色空间是灰度空间,只需处理黑色和白色,组合出不同的灰色。
彩色空间有好多中表示方法,但原理相同,都是把颜色分成三个或四个基元素,组合出不同颜色。

各种颜色空间:
  1. RGB 基色为红、绿、蓝,采用和人眼相似的工作机制,多应用于显示设备,这种方式受亮度影响比较大。
  2. HSV(Hue, Saturation, Value)、HSL(Hue, Saturation, Lightness) 基元素为色调、饱和度、亮度/明度。这种方法更接近与人类感知颜色的过程(人类是从色调、饱和度、明亮度三个方面感知颜色的),而且这种方法表示的图像对环境光的影响不敏感。
  3. YCrCb 即YUV,在JPEG图像格式、人脸识别、彩色视频信号优化中应用比较广泛。
  4. CIE L*a *b 不常用,百度百科

每个颜色空间的各个组成元素都有自己的定义域,取决于其数据类型,如何储存元素决定了我们在其定义域上能够控制的精度。
最小的数据类型为char(占一个字节/8位),有符号(char)0-255,无符号(unsigned char)-128到127
float(4字节,32位),double(8字节,64位)

三、显式创建Mat类的几种方法

1.使用Mat()构造函数
Mat M(2, 2, CV_8UC3, Scalar(0, 0, 225)); //2行2列的矩阵,三通道
cout << "M = " << endl << " " << M << endl << endl;

运行结果:

CV_8UC3含义,8位unsigned char型,3通道
通用规则:CV_[位数][是否有符号][类型前缀]C[通道数]

猜你喜欢

转载自blog.csdn.net/maizousidemao/article/details/81540976
Mat
今日推荐