赞
踩
什么是数字图像?
数字图像是物理图像(客观世界中,以自然形式呈现出的图像,也叫做连续图像)的连续信号值被离散化后,以像素为单元组成的二维矩阵,每个像素通过离散的数值进行表征 (如图)。
数字图像三要素:
(1)图像大小:图像的长(length)和宽(width),即图像在长度和宽度方向上的像素个数;
(2)图像通道数:可以理解位表征一个像素单元需要的数值个数;比如灰度图只有明暗变化,因此只需要一个数值表征,通道数为1;彩图通常需要三个通道(数值)R、G、B来表征,通过R、G、B不同的比例合成需要的颜色,因此通道数为3;
(3)图像的深度:用来存储表征通道数值所占内存的BIT位数,例如用0~255的整数来表述灰度图每个像素的值,255=28,则8即为图像深度;而由于位数相同,数据类型不同,数值的范围也会不同,因此定义图像矩阵时必须明确数值是有符号(S)型还是无符号型(U),是否为浮点型(F)。
*关于数值类型的详细介绍请参考官网:数值类型
在Opencv中,Mat类表示一个N维单通道或多通道数值矩阵,可以用它来存储由实数或复数构成的向量、矩阵、灰度或彩色图像、体素、向量场、点云、张量和直方图(高维的直方图最好存储在SparseMat中),下面就来介绍Mat类的创建和操作。
图像矩阵在Mat对象中的存储:
Mat类由两部分组成:矩阵头(包含矩阵大小、存储方法、存储地址等信息)和一个指向所有像素值的指针。矩阵头的尺寸是常数值,但是矩阵本身的大小可能因图像的不同而不同,并且通常比矩阵头要大几个数量级。
下图是一张3通道彩图在内存中存储的方式,用取色器取色并和内存中数据存储顺序对比,可以看到3原色存储的顺序是B(蓝色)、G(绿色)、R(红色),同一行像素存储在矩阵的同一行,因此当图像大小是mxn时,通道数位c时,矩阵的大小为mxcn。
Mat对象的创建
#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { //---------【Mat对象的使用】----------- Mat A = imread("C:\\Users\\ZH\\Desktop\\2_20191012\\1.png", 1); //复制和赋值,只创建Mat对象信息头,公用一个矩阵 Mat B(A); //复制 Mat C = A; //赋值 //创建只引用部分矩阵数据的信息头 Mat D(A, Rect(1, 400, 100, 500)); //使用Rect()函数 Mat E = A(Range::all(), Range(1,50)); //使用Range()函数 //clone()函数和copyTo()函数创建信息头并将矩阵复制(会降低运算速度) Mat F = A.clone
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。