RGB与YUV探索
一、常见的颜色模型
RGB主要用于电子系统里表达和显示颜色--电子屏幕显示的颜色
YUV是被欧洲电视系统所采用的一种颜色编码方法
CMYK印刷四色模式用于彩色印刷, 三原色(红黄蓝)+black
二、RGB与YUV基本概念
RGB: 按三基色加光系统的原理来描述颜色(红绿蓝)
RGB颜色空间
YUV: 按照亮度, 色差的原理来描述颜色
图像生成RGB分量与YUV分量
2.1 YUV基本概念
Y: 明亮度, 即灰阶值. 通过RGB输入信号建立的, 即将RGB信号的特定部分叠加在一起
解释:
每个像素都是由RGB三个子像素组成的, 每个子像素其背后的光源都是可以显现不同的亮度级别,灰阶代表了由最暗到最亮之间不同亮度的层次级别。把三原色每一个颜色从最暗到最亮过程中的变化级别划分为色彩的灰阶。由下图可以看出划分的灰阶越多所能够呈现出来的画面也越细腻。以8bit为例,我们称其为256灰阶。
256灰阶
UV:色度, 描述影像色彩以及饱和度, 即指定像素的颜色. 色度定义了颜色两个方面:色调(色彩总体倾向, 冷暖色调)和饱和度(色彩的鲜艳程度)
我们常说的 YUV ,其实指的是 YCbCr.
Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异.
Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异.
简而言之, CrCb分别代表当前颜色对蓝色和红色的偏移程度.
应用上, 视频采集芯片输出的码流一般都是 YUV 格式数据流,后续视频处理也是对 YUV 数据流进行编码和解析, 所以了解YUV格式以及相互转换挺重要的.
2.2 YUV优点
- YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视(Y分量),这一特性用在于电视信号上。
- YUV是数据总尺寸小于RGB格式(但用YUV444的话,和RGB888一样都是24bits), 所需要占用的带宽较小, RGB要求三个独立的视频信号同时传输
人眼对色度的敏感程度低于对亮度的敏感程度。主要原因是视网膜杆细胞多于视网膜锥细胞,其中视网膜杆细胞的作用就是识别亮度,视网膜锥细胞的作用就是识别色度。所以,眼睛对于亮度的分辨要比对颜色的分辨精细一些。利用这个原理,可以把色度信息减少一点,人眼也无法察觉这一点。同样地,YUV格式在照片的处理上允许降低色度的带宽。在图像的显示上Y分量就可以显示出黑白图像,再根据UV分量显示对应的色彩,和RGB编码格式相比,YUV编码降低了一些图像的质量,但却大大提升了传输效率(RGB编码格式需要R、G、B三个分量同时传输)。
三、RGB与YUV之间的转换
YUV颜色模型, 会有很多叫法, 一般情况, 将YUV、Y'UV、YCbCr, YPbPr包含在YUV颜色模型的范围内, 不同的颜色模型用途不同, 与RGB的转换公式也就不尽相同
-
在电视系统发展的早期,YUV和Y'UV都是颜色信息的模拟信号编码形式,虽然Y和Y'都表示亮度,但是两种亮度的意义却天差地别,Y用来代指luminance,表示的是自然颜色的亮度,而Y'代指luma,表示的是经过伽马压缩之后电信号的强度。
-
在现在的计算机系统中,YUV一般用来代指YCbCr,用来表示文件的编码格式,用于数字视频的编码,而YPbPr颜色模型常常用在模拟分量视频中。
所以YUV颜色模型到RGB颜色模型的转换,应该对应两种方式,分别是模拟YUV->模拟RGB、数字YUV->数字RGB。不过因为标清、高清、以及超清幅面,YUV转RGB的权重值各不相同,需要将模拟信号和数字信号再做一次幅面划分,就出现了2*3 = 6,6中转换公式。
在 Keith Jack 的书 “Video Demystified” (ISBN 1-878707-09-4) 给出的公式是这样的:
RGB 的范围是 [0,255],Y 的范围是 [16,235] ,UV 的范围是 [16,239], 如果计算结果超出这个范围就截断处理.
在Android中,RGB的范围是[0,1]
所以上面的公式变为
CCIR 601 定义的转换公式是:
R = Y + 1.403V
G = Y−0.344U−0.714V
B = Y + 1.770U
这里 RGB 的取值范围是 [0,1]。 Y 的范围是 [0,1], Cr 和 Cb 的范围是[−0.5,0.5]。
我们在这里可以看出CbCr的概念:
Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异
Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。
四、YUV 采样格式
YUV的采样有许多种,常用的有444,422,420等.
以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量
4.1 YUV 4:4:4采样
YUV 4:4:4采样,每一个Y对应一组UV分量, 也就是 Y、U、V 三分量采样率相同,即每个像素的三分量信息完整,都是 8bit,每个像素占用 3 个字节。如果水平方向有 100 个像素点,那么采样了 100个 Y 分量,采样了 100 个 UV 分量。
四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
采样的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
映射出的像素点为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
可以看到这种采样方式与 RGB 图像大小是一样的。
4.2 YUV 4:2:2采样
YUV 4:2:2采样,每两个Y共用一组UV分量, 也就是 UV 分量的采样率是 Y 分量的一半(水平降采样)。
四个像素为: [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]
其中,每采样一个像素点,都会采样其 Y 分量,而 U、V 分量都会间隔采集一个,映射为像素点时,第一个像素点和第二个像素点共用了 U0、V1 分量,以此类推。从而节省了图像空间。
比如一张 1920 * 1280 大小的图片,采用 YUV 4:2:2 采样时的大小为:
(1920 * 1280 * 8 + 1920 * 1280 * 0.5 * 8 * 2 ) / 8 / 1024 / 1024 = 4.68M
可以看出,比 RGB 节省了三分之一的存储空间。
4.3 YUV 4:2:0采样
YUV 4:2:0采样,每四个Y共用一组UV分量。YUV 4:2:0 并不意味着不采样 V 分量。它指的是对每条扫描线来说,只有一种色度分量以 2:1 的采样率存储,相邻的扫描行存储不同的色度分量。也就是说,如果第一行是 4:2:0,下一行就是 4:0:2,在下一行就是 4:2:0,以此类推。
图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 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]、[Y7 U2 V7]、[Y8 U2 V7]
其中,每采样一个像素点,都会采样 Y 分量,而 U、V 分量都会隔行按照 2:1 进行采样。
一张 1920 * 1280 大小的图片,采用 YUV 4:2:0 采样时的大小为:
(1920 * 1280 * 8 + 1920 * 1280 * 0.25 * 8 * 2 ) / 8 / 1024 / 1024 = 3.51M
Note:相比 RGB,节省了一半的存储空间。
4.4 采样方式比较总结
对于一张 1920*1280大小的图片,根据前面所述采样方式我们可以得出:
YUV 4:4:4 :(19201280 * 8 + 19201280 * 1 * 8 * 2)/ 8 / 1024 / 1024 = 7.03 MB
YUV 4:2:2 :(19201280 * 8 + 19201280 * 0.5 * 8 * 2)/ 8 / 1024 / 1024 = 4.69 MB
YUV 4:2:0 :(19201280 * 8 + 19201280 * 0.25 * 8 * 2)/ 8 / 1024 / 1024 = 3.52 MB
由此可见YUV 4:4:4的采样方式相比 RGB 并没有节省存储空间,YUV 4:2:2节省了三分之一的存储空间,在传输时占用的带宽也会随之减少;YUV 4:2:0 采样节省了一半的存储空间,因此它也是比较主流的采样方式。
五、YUV存储格式
YUV 数据有三种存储格式:
- 平面格式(planar format):先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的 V。
- 打包/紧缩格式(packed format):每个像素点的 Y、U、V 是连续交错存储的。
- 半平面格式(semi-planar format):是前两者的混合,一部分分量用 planar 方式存储,另一部分分量用 packed 方式存储。也就是先连续存储所有像素点的Y,再连续交错存储U和V。
六、YUV分类
按照采样方式和存储格式将yuv图像分类如下
其中YUV420P和YUV420SP根据U、V的顺序,又可分出2种格式
- YUV420P:U前V后即YUV420P,也叫I420, V前U后,叫YV12。
- YUV420SP:U前V后叫NV12, V前U后叫NV21。
数据排列:
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP
另, YUV422 packed planar: YUVY, UYVY, VYUY, YVYU, 也只不过是数据矩阵中Y,U,V顺序差别.
七、常见YUV格式
选取YUV420、YUV422来分别展示这三种存储格式:YUV422P、UYVY422 Packet、YUV422SP
YUV420P、UYVY420 Packet、YUV420SP
7.1 YUV422P
每两个连续的Y分量公用一个UV分量,Y分量后面跟U分量,然后为V分量
7.2 UYVY422 Packet
每两个连续的Y分量公用一个UV分量,并且采用紧凑型进行存储
7.3 YUV422SP
每两个连续的Y分量公用一个UV分量,前面是Y分量,后面是U,V分量交错存储
7.4 YUV420P
每2x2像素公用一个UV分量,Y分量后面跟U分量,然后为V分量
7.5 YUV420 Packet
每2X2的Y分量公用一个UV分量,并且将YUV打包到一个平面
7.6 YUV420SP(NV12、NV21)
每2x2像素公用一个UV空间,可看成是用隔行UV采样,将UV分量交错打包到一个平面中.
NV12 和 NV21 格式都属于 YUV420SP 类型,手机摄像头采集预览数据就为这两种格式
NV12 和 NV21 格式都先存储了 Y 分量,但接下来并不是再存储所有的 U 或者 V 分量,而是把 UV 分量交替连续存储。NV12 是 IOS 中有的模式,它的存储顺序是先存 Y 分量,再 UV 进行交替存储,按照[YYUV]格式进行存放;NV21 是 安卓中有的模式,它的存储顺序是先存 Y 分量,在 VU 交替存储,按照[YYVU]格式进行存放.