opencv——Mat对象depth(CV_8UC3、CV_32F等)

Mat对象构成

class CV_EXPORTS Mat
{
    
    
public/*..很多方法..*/
/*............*/
 
int flags;/*flags指定图像的颜色空间  
            flags > 0 3通道的彩色图像
            flags = 0 灰度图像
            flags < 0 不作改变
          */
int dims;  /*数据的维数*/
int rows,cols; /*行和列的数量;数组超过2维时为(-1,-1)*/
uchar *data;   /*指向数据*/
int * refcount;   /*指针的引用计数器; 阵列指向用户分配的数据时,指针为 NULL
/* 其他成员 */ 
...
};

Mat常用成员

  • 1、data Mat 对象中的一个指针,指向存放矩阵数据的内存(uchar* data)

  • 2、dims 矩阵的维度,34的矩阵维度为2维,34*5的矩阵维度为3维

  • 3、channels 矩阵通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12
    个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。

  • 4、depth 深度,即每一个像素的位数,也就是每个通道的位数。
    在opencv的Mat.depth()中得到的是一个0 –6的数字,分别代表不同的位:
    enum
    {CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5, CV_64F=6},

可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位。

bit_depth

比特数—代表8bite,16bites,32bites,64bites…

CV_8|32|64

如果你现在创建了一个存储–灰度图片的Mat对象,这个图像的大小为宽100,高100

那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位–所以它对应的就是CV_8。

同理,CV_32就是每一个像素点占32bit

S|U|F

  • S–代表—signed int—有符号整形

  • U–代表–unsigned int–无符号整形

  • F–代表–float---------单精度浮点型

C

一张图片的通道数

  • channels = 1:灰度图片–grayImg—是–单通道图像

  • channels = 3:RGB彩色图像---------是–3通道图像

  • channels = 4:带Alph通道的RGB图像–是--4通道图像

如:
CV_8UC3
就是8位无符号三通道的图像

若没有写C几,默认是单通道
如CV_8U = CV_8uC1

Mat对象创建方法

  • Mat(int rows, int cols, int _type);
  • Mat(Size size,int _type);

imshow显示图像的映射

  • 如果载入的图像是8位无符号类型(8-bit unsigned),就显示图像本来的样子。

  • 如果图像是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer,有符号位),便用像素值除以256。也就是说,值的范围是 [0,255 x 256]映射到[0,255]。

  • 如果图像是32位或64位浮点型(32-bit floating-point or 64-bit floating-point),像素值便要乘以255。也就是说,该值的范围是 [0,1]映射到[0,255]。

我的理解:
这些都是图像数据存储的方式,使用imshow显示的时候默认是CV_8显示,于是需要映射。原来16bit的数据用8bit显示,就损失了图像的丰富度。(这就是为什么mac的图像管理比windows优秀)

8bit是0~255,16bit就是两个8bit接起来,即有8bit个8bit数据。

float在内存中占4个字节,也就是32位

如:CV_8U的灰度或BGR图像的颜色分量都在0~255之间。直接imshow可以显示图像。 CV_32F或者CV_64F取值范围为0~1.0,imshow的时候会把图像乘以255后再显示。

猜你喜欢

转载自blog.csdn.net/qq_28258885/article/details/112563298