相机ISP图像处理流程

摄像机模组与图像处理:
在这里插入图片描述
事实上,ISP 除了上面提到的主要功能外,还需要支持 DENOISE,CONTRAST、SATURATION、SHARPNESS 等调整功能。
3A技术即自动对焦(AF)、自动曝光(AE)和自动白平衡(AWB)3A数字成像技术利用了AF自动对焦算法、AE自动曝光算法及AWB自动白平衡算法来实现图像对比度最大、改善主体拍摄物过曝光或曝光不足情况、使画面在不同光线照射下的色差得到补偿,从而呈现较高画质的图像信息。采用了3A数字成像技术的摄像机能够很好的保障图像精准的色彩还原度,呈现完美的日夜监控效果。在这里插入图片描述
镜头:
在这里插入图片描述
IR cut filter,即红外截止滤光片,它放在于LENS与Sensor之间。因人眼与CMOS Sensor对各波长的响应不同,人眼看不到红外光但sensor会感应,因此需要IR cut filter阻绝红外光。

模组结构:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
快门的工作原理:
在这里插入图片描述
相机的快门有两道闸门,分别是:前帘、后帘。大家可以看上面的动图,在靠近镜头哪里的闸门被称为“前帘”,靠近传感器的闸门被称为“后帘”。
在进行拍摄时,后帘从下往上打开,这个时候不会有光量,因为前帘还是闭合的。当后帘从下往上打开,然后前帘从上往下打开,画面从上往下进行曝光,这就是“咔”。
等曝光结束后,后帘就从上往下闭合,后帘一闭合整个曝光就结束了,这就是“嚓”。所以拍照时咔嚓、咔嚓、咔嚓的声音就是这么来的。等到前帘闭合后,就可以进行下一次曝光了。

相机之所以有两个快门帘,就是为了能从上往下曝光,也能从上往下结束曝光。如果相机只有一个前帘,那么是从上往下开始曝光,当曝光结束就要从下往上了,这就会导致上面的曝光比下面多。当你使用非常快的快门速度进行拍摄时,画面曝光就会出现不一样的情况

Sonser:又分为两种:CMOS & CCD ,目前用到的就是 CMOS.

CMOS图像传感器本质是一块芯片 ,主要包括:感光区阵列(Bayer阵列,或叫像素阵列)、时序控制、模拟信号处理以及模数转换等模块。
主要作用把光信号转化成电信号 ,然后通过ADC 转化成数字信号.

Lens:用来接收光线,但camera module上会使用很多片 ,镜头的片数越多,解析力越高,但是厚度会增加,以及制作工艺难度也会加大.
IR cut filter/Blue glass: IR cut filter滤除红外光,减少ghost图像。蓝玻璃是用来增加特定波段的蓝光.

ISP处理流程结构图如下:
在这里插入图片描述

图像Bayer格式介绍

A: 为什么要使用Bayer ?
—> 对于彩色图像,需要采集多种最基本的颜色,如rgb三种颜色,最简单的方法就是用滤镜的方法,红色的滤镜透过红色的波长,绿色的滤镜透过绿色的波长,蓝色的滤镜透过蓝色的波长。如果要采集rgb三个基本色,则需要三块滤镜,这样价格昂贵,且不好制造,因为三块滤镜都必须保证每一个像素点都对齐,所以当使用bayer格式的时候,就解决了这个问题
B: bayer格式数据排列?
----> Bayer格式是相机内部的原始图片, 即RAW图,是isp处理前的原始图片,由于人眼对绿色较为敏感,所以一般bayer格式的图片绿色格式的像素是r和g像素的和,bayer色彩滤波阵列,由一半的G,1/4的R ,1/4的B组成

  1. bayer格式图像传感器硬件:
    在这里插入图片描述

每一个感光像素之间都有Metal Opaque Laye(金属隔离层),光纤通过Microlens(显微镜头),在Color Filter Array(CFA)(色彩滤波器过滤)之后,投射到相应的漏洞式photodiode silicon(硅的感光元件)上

  1. Bayer感光阵列示意图:
    柯达公司的拜耳提出一种解决方案,只用一个图像传感器,但是在图像传感器的前面放置一个滤光层,滤光层的滤光点与图像传感器的像素一一对应,每个滤光点只能通过红、绿、蓝三种光其中之一在这里插入图片描述
    这种可以通过不同颜色滤光点的排列是有规律的,每个绿色点的左上、右上、左下、右下分布的绿点,上下分布的是红点,左右分布的是蓝点。绿点的数量是红色或者蓝色数量的两倍,是因为研究发现人眼对绿色是最为敏感的。
    那么图像传感器的每个像素只可能取四种可能的值:红、绿、蓝、黑(没有光透过)。
    现在得到的图像也只有四种颜色,显然还无法表达真实世界的颜色。所以还需要根据每个像素周围的颜色来近似恢复它原来的值,最后得到彩色图像。这个过程叫做“去马赛克(demosaicing)”。

去马赛克有不同的实现方法,简单的内插法,比如绿色过滤器的像素精确测量了绿色成分,而该像素红色和蓝色的成分则是从邻区获取。一个绿色像素的红色数值可由相邻两个红色像素内插计算出来;同样的,内插相邻两个蓝色像素也能计算出蓝色数值

由于人眼对绿色较为敏感,所以一般bayer格式的图片绿色格式的像素是r和g像素的和,如下图:Bayer色彩滤波阵列(Bayer Color Filter Array,CFA),由一半的G,1/4的R,1/4的B组成,
在这里插入图片描述
3. RAW data格式:
RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据。RAW文件是一种记录了数码相机传感器的原始信息,同时记录了由相机拍摄所产生的一些元数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。sensor的每一像素对应一个彩色滤光片,滤光片按Bayer pattern分布。将每一个像素的数据直接输出,即RAW RGB data.

Raw data(Raw RGB)经过彩色插值(DEMOSAIC )就变成RGB.

华为P30pro夜间拍摄牛逼,用到了RYYB的滤镜阵列设计,RYYB就是将两个绿色像素(G)换成黄色像素(Y)替代, Y(红色和绿色组合).
请查看文档:

http://www.openpcba.com/web/contents/get?id=3605&tid=15

4.ISP全称Image Signal Processing,即图像信号处理。主要用来对前端图像传感器输出信号处理的单元,以匹配不同厂商的图象传感器。

ISP 通过一系列数字图像处理算法完成对数字图像的效果处理。主要包括3A、坏点校正、去噪、强光抑制、背光补偿、色彩增强、镜头阴影校正等处理。ISP 包括逻辑部分以及运行在其上的firmware。
ISP 的控制结构如图,lens 将光信号投射到sensor 的感光区域后,sensor 经过光电转换,将Bayer 格式的原始图像送给ISP,ISP 经过算法处理,输出RGB 空间域的图像给后端的视频采集单元。在这个过程中,ISP 通过运行在其上的firmware 对ISP逻辑,lens 和sensor 进行相应控制,进而完成自动光圈、自动曝光、自动白平衡等功能。其中,firmware
的运转靠视频采集单元的中断驱动。PQ Tools 工具通过网口或者串口完成对ISP 的在线图像质量调节。
在这里插入图片描述
ISP 的Firmware 包含三部分,一部分是ISP 控制单元和基础算法库,一部分是AE/AWB/AF 算法库,一部分是sensor 库。Firmware 设计的基本思想是单独提供3A 算法库,由ISP 控制单元调度基础算法库和3A 算法库,同时sensor 库分别向ISP 基础算法库和3A 算法库注册函数回调,以实现差异化的sensor 适配。ISP firmware 架构如图:
在这里插入图片描述
不同的sensor 都以回调函数的形式,向ISP 算法库注册控制函数。ISP 控制单元调度基础算法库和3A 算法库时,将通过这些回调函数获取初始化参数,并控制sensor,如调节曝光时间、模拟增益、数字增益,控制lens 步进聚焦或旋转光圈等

  1. RGB565 与 RGB888转化关系,代码实现如下:
#define RGB888_RED      0x00ff0000
#define RGB888_GREEN    0x0000ff00
#define RGB888_BLUE     0x000000ff

#define RGB565_RED      0xf800
#define RGB565_GREEN    0x07e0
#define RGB565_BLUE     0x001f 
unsigned short RGB888ToRGB565(unsigned int n888Color){ 
	 unsigned short n565Color = 0;  
	 // 获取RGB单色,并截取高位 
	 unsigned char cRed   = (n888Color & RGB888_RED)   >> 19; 
	 unsigned char cGreen = (n888Color & RGB888_GREEN) >> 10; 
	 unsigned char cBlue  = (n888Color & RGB888_BLUE)  >> 3;  
	 // 连接 
	 n565Color = (cRed << 11) + (cGreen << 5) + (cBlue << 0); 
	 return n565Color;
}
unsigned int RGB565ToRGB888(unsigned short n565Color){
	 unsigned int n888Color = 0;  
	 // 获取RGB单色,并填充低位 
	 unsigned char cRed   = (n565Color & RGB565_RED)    >> 8; 
	 unsigned char cGreen = (n565Color & RGB565_GREEN)  >> 3; 
	 unsigned char cBlue  = (n565Color & RGB565_BLUE)   << 3;  
	 // 连接 
	 n888Color = (cRed << 16) + (cGreen << 8) + (cBlue << 0); 
	 return n888Color;
}

ISP处理Bayer image详细讲解:

Bayer(拜耳滤波器得到彩色)
图像在将实际的景物转换为图像数据时, 通常是将传感器分别接收红、 绿、 蓝三个分量的信息, 然后将红、 绿、 蓝三个分量的信息合成彩色图像。 该方案需要三块滤镜, 这样价格昂贵,且不好制造, 因为三块滤镜都必须保证每一个像素点都对齐。
通过在黑白 cmos 图像传感器的基础上, 增加彩色滤波结构和彩色信息处理模块就可以获得图像的彩色信息, 再对该彩色信息进行处理, 就可以获得色彩逼真的彩色图像。通常把彩色图像传感器表面覆盖的滤波称为彩色滤波阵列(Color Filter Arrays,CFA)。
目前最常用的滤镜阵列是棋盘格式的, 已经有很多种类的, 其中绝大多数的摄像产品采用的是原色贝尔模板彩色滤波阵列(Bayer Pattern CFA)。R、G、B 分别表示透红色、透绿色和透蓝色的滤镜阵列单元。由于人的视觉对绿色最为敏感,所以在 Bayer CFA 中G分量是 R和B 的二倍,在每个像素点上只能获取一种色彩分量的信息,然后根据该色彩分量的信息通过插值算法得到全色彩图像。

A. BLC(BlackLevel Correction)------黑电平校正
–>在调试相机镜头过程, 把设备放入封闭的密封箱中,会发现镜头呈现黑色,但是黑色的程度不够黑,这是由于暗电流的影响, 传感器出来的实际原始数据并不是我们需要的黑平衡( 数据不为0),所以需要找到一个矫正值,然后将所有的区域的像素减去此矫正值,如果图像呈现纯黑色,说明矫正成功,左边未校验,右边是矫正后的图像
在这里插入图片描述
B. LSC(Lens Shade Correction)------镜头阴影校正
由于相机在成像距离较远时,随着视场角慢慢增大,能够通过照相机镜头的斜光束将慢慢减少,从而使得获得的图像中间比较亮,边缘比较暗,这个现象就是光学系统中的渐晕。由于渐晕现象带来的图像亮度不均会影响后续处理的准确性。因此从图像传感器输出的数字信号必须先经过镜头矫正功能块来消除渐晕给图像带来的影响.
常用的镜头矫正的具体实现方法是,首先确定图像中间亮度比较均匀的区域,该区域的像素不需要做矫正;以这个区域为中心,计算出各点由于衰减带来的图像变暗的速度,这样就可以计算出相应R、G、B通道的补偿因子(即增益)。下图左边图像是未做镜头阴影校正的,右边图像是做了镜头阴影校正的。
在这里插入图片描述
备注: 在项目过程中还可以把将头贴着对准白色物体,有时候由于镜头的原因,四个边角会产生暗角。有些镜头由于工艺的问题,会导致没法通过软件的方式修复
C: BPC(Bad Point Correction)------坏点校正
常用检测方法是在全黑环境下看亮点和彩点和在盖白板的情况下看黑点和彩点。或者把镜头这个黑色物体,拍摄照片,然后观察,会发现图片上有坏点,并且是无规律的散列到图片的各个地方,由于图像传感器中CFA的应用,每个像素只能得到一种颜色信息,缺失的两种颜色信息需要从周围像素中得到。如果图像中存在坏点的话,那么坏点会随着颜色插补的过程往外扩散,直到影响整幅图像。因此必须在颜色插补(Demosaic)之前进行坏点的消除。

D: Demosaic------颜色插值
在做这一步之前,必须做坏点矫正,不然做颜色插值的时候,都是通过相邻的几点像素点来算出当前像素点,坏点容易往外扩散。经过滤色板的作用之后,每个像素点只能感应到一种颜色。必须要找到一种方法来复原该像素点其它两个通道的信息,寻找该点另外两个通道的值的过程就是颜色插补的过程。由于图像是连续变化的,因此一个像素点的R、G、B的值应该是与周围的像素点相联系的,因此可以利用其周围像素点的值来获得该点其它两个通道的值。目前最常用的插补算法是利用该像素点周围像素的平均值来计算该点的插补值。
在这里插入图片描述

E:Bayer Denoise-----去除噪声
使用 cmos sensor 获取图像,光照程度和传感器问题是生成图像中大量噪声的主要因素, 当信号经过 ADC 时, 又会引入其他一些噪声. 所以,这部分主要是处理Bayer 图像的噪声。一般采用非线性去噪算法, 例如双边滤波器, 在采样时不仅考虑像素在空间距离上的关系, 同时加入了像素间的相似程度考虑, 因而可以保持原始图像的大体分块, 进而保持边缘。

F: AWB(Automatic White Balance)------自动白平衡
人类视觉系统具有颜色恒常性的特点,因此人类对事物的观察可以不受到光源颜色的影响。但是图像传感器本身并不具有这种颜色恒常性的特点,因此,其在不同光线下拍摄到的图像,会受到光源颜色的影响而发生变化。例如在晴朗的天空下拍摄到的图像可能偏蓝,而在烛光下拍摄到的物体颜色会偏红。因此,为了消除光源颜色对于图像传感器成像的影响,自动白平衡功能就是模拟了人类视觉系统的颜色恒常性特点来消除光源颜色对图像的影响的。
白平衡顾名思义就是让白色在任何色温下camera都能把它还原成白,由于色温的影响,一张白纸在低色温下会偏黄,高色温下会偏蓝,白平衡的目的就是白色物体在任何色问下都是R=G=B呈现出白色,比较常用的AWB算法有灰度世界,完美反射法等
在这里插入图片描述
G:CCM(Color Correction Matrix)------颜色校正
颜色校正主要为了校正在滤光板处各颜色块之间的颜色渗透带来的颜色误差。一般颜色校正的过程是首先利用该图像传感器拍摄到的图像与标准图像相比较,以此来计算得到一个校正矩阵,一般情况下,对颜色进行校正的过程,都会伴随有对颜色饱和度的调整。颜色的饱和度是指色彩的纯度,某色彩的纯度越高,则其表现的就越鲜明;纯度越低,表现的则比较黯淡。

AWB已经将白色校准了,CCM就是用来校准白色除白色以外其他颜色的准确度的,用一个3X3的CCM矩阵来校准, 其中每一列系数r1+g1+b1等于一个恒定值1。Ccm矫正最终结果可以通过拍摄24色卡图片然后用imatest分析来做分析参考
在这里插入图片描述
H:RGB Gamma------Gamma校正
现在常用的伽马校正是利用查表法来实现的,即首先根据一个伽马值,将不同亮度范围的理想输出值在查找表中设定好,在处理图像的时候,只需要根据输入的亮度,既可以得到其理想的输出值。在进行伽马校正的同时,可以一定范围的抑制图像较暗部分的噪声值,并提高图像的对比度。还可以实现图像现显示精度的调整,比如从l0bit精度至8bit精度的调整。上图分别是未做Gamma校正的,下图是做了Gamma校正的。
在这里插入图片描述
I: RGBToYUV
YUV 是一种基本色彩空间, 人眼对亮度改变的敏感性远比对色彩变化大很多, 因此, 对于人眼而言, 亮度分量 Y 要比色度分量 U、 V 重要得多。 另外,YUV色彩空间分为YUV444,YUV422,YUV420等格式,这些格式有些比原始RGB图像格式所需内存要小很多,这样亮度分量和色度分量分别存储之后,给视频编码压缩图像带来一定好处。

J: Color denoise / sharpness
主要是对yuv降噪处理,同时为了消除降噪过程中对图像细节的损失,需要对图像进行锐化处理,还原图像的相关细节(为了抑制图像的彩色噪声, 一般采用低通滤波器进行处理。 例如使用M×N的高斯低通滤波器在色度通道上进行处理)

在YUV 色彩空间上彩噪去除与边缘加强、色彩与对比度加强,中间还要进行自动曝光控制等, 然后输出 YUV(或者RGB) 格式的数据, 再通过 I/O 接口传输到 CPU 中处理

1、RGB、YUV和YCbCr三种颜色空间
首先要说明,RGB、YUV和YCbCr都是人为规定的彩色模型或颜色空间(有时也叫彩色系统或彩色空间)。它的用途是在某些标准下用通常可接受的方式对彩色加以说明。本质上,彩色模型是坐标系统和子空间的阐述。
1.1、RGB
RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开。它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像。
1.2、YUV
YUV是北美NTSC系统和欧洲PAL系统中模拟电视信号编码的基础。

在 YUV 空间中,每一个颜色有一个亮度信号 Y,和两个色度信号 U 和 V。亮度信号是强度的感觉,它和色度信号断开,这样的话强度就可以在不影响颜色的情况下改变。

YUV 使用RGB的信息,但它从全彩色图像中产生一个黑白图像,然后提取出三个主要的颜色变成两个额外的信号来描述颜色。把这三个信号组合回来就可以产生一个全彩色图像。

Y 通道描述 Luma 信号,它与亮度信号有一点点不同,值的范围介于亮和暗之间。 Luma 是黑白电视可以看到的信号。U (Cb) 和 V (Cr) 通道从红 (U) 和蓝 (V) 中提取亮度值来减少颜色信息量。这些值可以从新组合来决定红,绿和蓝的混合信号。

YUV和RGB的转换:

  Y = 0.299 R + 0.587 G + 0.114 B
  U = -0.1687 R - 0.3313 G + 0.5 B + 128
  V = 0.5 R - 0.4187 G - 0.0813 B + 128
 
  R = Y + 1.402 (V-128)
  G= Y - 0.34414 (U-128) - 0.71414 (V-128)
  B= Y + 1.772 (U-128)

1.3、YCbCr
YCbCr 颜色空间是YUV的国际标准化变种,在数字电视和图像压缩(比如JPEG)方面都有应用。

YCbCr 是在世界数字组织视频标准研制过程中作为ITU - R BT1601 建议的一部分, 其实是YUV经过缩放和偏移的翻版。其中Y与YUV 中的Y含义一致, Cb , Cr 同样都指色彩, 只是在表示方法上不同而已。在YUV 家族中, YCbCr 是在计算机系统中应用最多的成员, 其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。

YCbCr与RGB的相互转换

    Y=0.299R+0.587G+0.114B
    Cb=0.564(B-Y)
    Cr=0.713(R-Y)
     R=Y+1.402Cr
    G=Y-0.344Cb-0.714Cr
    B=Y+1.772Cb

补充、YUV(YCbCr)采样格式
主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值), 每 2 x 2 个点保存一个 Cr和Cb值, 图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 每个点需要 8x3=24 bits, 而现在仅需要 8+(8/4)+(8/4)=12bits, 平均每个点占12bits。这样就把图像的数据压缩了一半上边仅给出了理论上的示例,在实际数据存储中是有可能是不同的,下面给出几种具体的存储形式:
(1)、 YUV 4:4:4
YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
  
(2)、YUV 4:2:2
 每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存(例如下面映射出的前两个像素点只需要Y0、Y1、U0、V1四个字节)。

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

存放的码流为: Y0 U0 Y1 V1 Y2 U2 Y3 V3

映射出像素点为:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
 (3)、 YUV 4:1:1
 4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

存放的码流为: Y0 U0 Y1 Y2 V2 Y3

映射出像素点为:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
 (4)、 YUV4:2:0
  4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0…以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。

下面八个像素为:

[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 
[Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8] 

存放的码流为:

Y0 U0 Y1 Y2 U2 Y3 
Y5 V5 Y6 Y7 V7 Y8 

映射出的像素点为:

[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7] 

[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]

除了yuv4:4:4没有压缩外,其它几种,都是对色度数据做过压缩,YUV 的优点之一是基于人眼对色度的敏感程度要低于对亮度的敏感程度,可以适当降低色度的采样率,同时不会明显降低视觉质量, 下面的截图,能否很好的帮忙理解,不同的格式是如何压缩以及如何映射出对应的像素点, 用圆圈圈起来部分,就是要存储的色度值:
在这里插入图片描述

YUV格式有两大类:planar和packed。

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。

YUV采样的进一步说明
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,关于其详细原理,可以通过网上其它文章了解,这里我想强调的是如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。

用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。
在这里插入图片描述
先记住下面这段话,以后提取每个像素的YUV分量会用到。
YUV 4:4:4采样,每一个Y对应一组UV分量, 每像素 24 位
YUV 4:2:2采样,每两个Y共用一组UV分量, 每像素 16 位
YUV 4:2:0采样,每四个Y共用一组UV分量, 每像素 12位

下面用一种表说明几种常见存储方式所占用的内存,以 w*h 大小的图像为例:
在这里插入图片描述
例如:w*h = 320*180
YUV4:4:4 :y:320*180, u:320*180, v:320*180, 即size=3*320*180
YUV4:2:2 :y:320*180, u:320*180/2, v:320*180/2, 即size=2*320*180
YUV4:2:0 :y:320*180, u:320*180/4, v:320*180/4, 即size=1.5*320*180

首先了解视频编码为什么使用YUV420而不是rgb。那么需要了解两者的原理,看图说话:
在这里插入图片描述
所以从内存的角度来说,yuv单位像素使用的内存更低,但是两者表示的效果是一致的,也可以认为rgb过度绘制了,把人眼无法分辨的区域也进行了绘制。
下面看一下两者之间内存暂用对比,这里采用·rgb24对比
RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。在一个2*2的像素区域,RRG暂用的字节数为2*2*3=12字节。那么用yuv表示,占用的字节数为4(Y)+1(u)+1(v)=6字节,其中Y占用4个字节,U和V各占用1字节,比例为4:1:1
所以在一个宽高为w*h的设备上,使用rgb表示编码占用的字节数为w*h*3,使用yuv表示暂用的内存为w*h*+w*h/4+w*h/4 = w*h*3/2.

YUV422内存排列如下:
在这里插入图片描述
在这里插入图片描述
yuv编码分类:
YUV420主要分为以下两种YUV420P & YUV420SP:

A.YUV420P:(YUV420 Planar)
又叫plane平面模式,Y , U , V分别在不同平面,也就是有三个平面,它是YUV 标准格式4:2:0
YUV420P: 主要分为两种格式YU12YV12:
1.1: YU12格式(安卓模式下,也叫I420格式):首先是所有Y值,然后是所有U值,最后是所有V值。
在这里插入图片描述

YU12:亮度(行×列) + U(行×列/4) + V(行×列/4)

1.2:YV12格式:首先是所有Y值,然后是所有V值,最后是所有U值
在这里插入图片描述

 YV12:亮度Y(行×列) + V(行×列/4) + U(行×列/4)

可以参考此结构:
在这里插入图片描述
B:YUV420SP(YUV420 Semi-Planar)
是一种two-plane模式,即Y和UV分为两个plane,但是UV(CbCr)为交错存储,而不是分为三个平面.
YUV420SP主要分为: NV12NV21
1.1:NV12(IOS只有这一种模式),存储顺序是先存Y值,再UV交替存储:YYYYUVUVUV,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节
在这里插入图片描述
1.2:NV21(安卓的模式),android手机从摄像头采集的预览数据一般都是NV21,存储顺序是先存Y,再VU交替存储,NV21存储顺序是先存Y值,再VU交替存储:YYYYVUVUVU,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节
在这里插入图片描述

NV12: YYYYYYYY UVUV    =>YUV420SP
NV21: YYYYYYYY VUVU    =>YUV420SP

可以参考此结构:
在这里插入图片描述

  • 40
    点赞
  • 261
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值