RGB是红、绿、蓝三原色,任何颜色都可以通过这三原色按不同比例混合出来。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将亮度、色调、饱和度三个量放在一起表示,很难分开。
在 YUV 空间中,每一个颜色有一个亮度信号 Y,和两个色度信号 U 和 V。亮度信号是强度的感觉,它和色度信号断开,这样的话强度就可以在不影响颜色的情况下改变,占用的存储空间对于RGB也较小。
用16个bit表示一个像素,最高位不用,5个bit表示R(红色),5个bit表示G(绿色),5个bit表示B(蓝色),那么一个屏幕像素点占1+5+5+5=16位,共2个字节。
用16个bit表示一个像素,5个bit表示R(红色),6个bit表示G(绿色),5个bit表示B(蓝色),那么一个屏幕像素点占5+6+5=16位,共2个字节。
用32个bit表示一个像素,8个bit表示A(透明度), 8个bit表示R(红色),8个bit表示G(绿色),8个bit表示B(蓝色) ,那么一个屏幕像素点占8+8+8+8=32位,共4个字节,注意ARGB的排列顺序是BGRA在解析数据时要注意。
用16个bit表示一个像素,4个bit表示A(透明度), 4个bit表示R(红色),4个bit表示G(绿色),4个bit表示B(蓝色) ,那么一个屏幕像素点占4+4+4+4=16位,共2个字节。
举例一个1280*720的图片对于这几种编码格式的图片大小:
RGB种类 | 图片大小 |
---|---|
RGB_555 | 1280 x 720 x 2 = 1.75M |
RGB_565 | 1280 x 720 x 2 = 1.75M |
ARGB_8888 | 1280 x 720 x 4 = 3.50M |
ARGB_4444 | 1280 x 720 x 2 = 1.75M |
常见YUV图像格式是由采样格式+存储格式共同决定的,如NV21、YV12、I420、YUY2等。
人眼对亮度(Y分量)的敏感度远远大于颜色(UV分量)的敏感度,所以丢弃某些UV分量,图像在肉眼中的感觉不会起太大的变化,主流的采样方式有四种,分别为YUV4:4:4,YUV4:2:2,YUV4:1:1,YUV4:2:0(常用常见)。
Planar平面格式:指先连续存储所有像素点的 Y 分量,然后存储 U 、V 分量。
Packed打包格式:指每个像素点的 Y、U、V 分量是连续交替存储的。
I420(YU12)和YV12都是YUV420P类型即先存储 Y 分量,再存储 U、V 分量,区别在于:I420 是先 Y 再 U 后 V,而 YV12 是先 Y 再 V 后 U 。
NV21、NV12 属于 YUV420SP 类型(IOS中有的类型)。即先存储了 Y 分量,再UV 分量交替存储。区别在于:NV12 是UV交替,而 NV21 是VU交替。
主要的YUV采样格式为YUV4:4:4,YUV4:2:2,YUV4:1:1,YUV4:2:0(常用),下面以图形化方式讲解。
YUV三个信道的抽样率相同,每个像素点的三个分量信息完整,每个分量用8bit表示,平均一个像素点占用3个字节。
Y:实心圆、U:空心圆 、V:交叉线
假如图像像素为:
[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]
U、V分量是Y分量的抽样率一半,每个像素点对应一个Y分量,水平方向每两个相邻像素点,抽取第一个像素点的U分量,抽取第二个像素点的V分量,则平均一个像素点占用2个字节。
Y:实心圆、U:空心圆 、V:交叉线
假如图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那么采样的码流为:
Y0 U0 Y1 V1 Y2 U2 Y3 V3
其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个
最后映射出的像素点为
[Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]
U、V分量是Y分量的抽样率1/4,每个像素点对应一个Y分量,水平方向每四个相邻像素点,抽取第一个像素点的U分量,抽取第三个像素点的V分量,则平均一个像素点占用1.5个字节。
Y:实心圆、U:空心圆 、V:交叉线
假如图像像素为:
[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]
U、V分量是Y分量的抽样率1/4,每个像素点对应一个Y分量,按行扫描,相邻两行中第一行每2个相邻像素点抽取第一个像素点的U分量,第二行每2个相邻像素点抽取第一个像素点的V分量,则平均一个像素点占用1.5个字节。
Y:实心圆、U:空心圆 、V:交叉线
假设图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y4 U4 V4]、[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7]
那么采样的码流为:
Y0 U0 Y1 Y2 U2 Y3 Y4 V4 Y5 Y6 V6 Y7
其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样
最后映射出的像素点为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
举例:
那么对不同类型的YUV来说一个1280*720的图像有多大呢?
YUV种类 | 图片大小 |
---|---|
YUV_444 | 1280 x 720 x 3 = 2.64M |
YUV_422 | 1280 x 720 x 2 = 1.75M |
YUV_411 | 1280 x 720 x 1.5 = 1.32M |
YUV_420 | 1280 x 720 x 1.5 = 1.32M |
R = Y + 1.402 (V-128)
G = Y - 0.34414 (U-128) - 0.71414 (V-128)
B = Y + 1.772 (U-128)
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
具体的代码实现及示例:参照雷神的帖子:YUV数据处理