在视频编解码中,经常看到YUV与RGB的字眼,如果不理解,那么就很难进一步学习视频编码算法。
先说一下RGB,R表示红,G表示绿,B表示蓝,这是最基本的三原色的表示方法,任何颜色都可以通过这三原色按不同比例混合出来,电脑的VGA显示器就是用这种颜色来表示的,我们用Windows系统的GDI函数操作显示器的像素的函数例如:SetTextColor就是用的这种颜色空间。
RGB三个分量的范围常见的是8位,表示的取值范围为0~255,0为信号最差,255为信号最强,当RGB的3个分量都为零时表示的是纯黑色,当RGB的三个分量都是255时,表示的是白色,当RGB的三个分量相等时,表示的是灰色,一般用RGB(128,128,128)来表示常见的灰色。
YUV是用于电视系统的颜色表示方法,Y表示的亮度;U与V代表颜色色度的两个方面,分别是从红色与蓝色里采样的的信号;如果没有UV信号,则电视将变成黑白电视。YUV颜色采样表示法是运动图像编码的采样表示法。
家里的电视有的有YCbCr接口,如果我们将 CbCr不插入,则图像是黑白图像。YCbCr是YUV的另一种说法,其实是YUV经过缩放和偏移的翻版。其中Y与YUV 中的Y含义一致,Cb,Cr 同样都指色彩,只是在表示方法上不同而已。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。
MPEG图像压缩采用的颜色信号采样标准就是YUV。
RGB与YUV 这两种颜色表示法都能表示颜色,它们是可以互相转换的。转换的公式如下:
3.1 RGB转YUV的转换公式:
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 + 1283.2 YUV转RGB的转换公式:
R = Y + 1.402 (V-128) G= Y - 0.34414 (U-128) - 0.71414 (V-128) B= Y + 1.772 (U-128)视频编解码时,是对图像的采样数据进行处理的。
从视频采集与处理的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264、MPEG视频编解码)的角度来说,也是在原始YUV码流进行编码和解析 ;如果采集的资源时RGB的,也需要转换成YUV。
我们必须根据采样格式从码流中还原每个像素点的YUV值,YUV格式有两大类:planar和packed。对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。
而YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0 。
YUV采样格式YUV 4:4:4采样 意味着Y、U、V三个分量的采样比例相同,所以在生成的图像里,每个像素的三个分量信息都是8bit。(Y用×表示,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]UV分量是Y分量的一般,Y分量和UV分量按照2:1的比例采样,如果水平方向有4个像素点,那么采样了4个Y分量,就只采样了2个UV分量。
假如图像像素为:[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] 通过这个例子就可以发现第一个像素点和第二个像素点共用了[U0、V1]分量,第三个像素点和第四个像素点共 用了[U2、V3]分量,这样就节省了图像空间。 比如一张1280*720大小的图片,如果按照RGB方式存储,会耗费: (1280x720x8+1280x720x8+1280x720x8)、8/1024/1024=2.637MB 其中1280*720是表示有多少个像素点。但如果采用了YUV4:2:采样格式: (1280x720x8+1280x720x0.5x8x2)/8/1024/1024=1.76MB 节省了1/3的存储空间,适合进行图像传输。YUV 4:2:0采样 YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1 。
假设图像像素为: [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 4:2:0采样后的图片大小为:
(1280x720x8+1280x720x0.25x8x2)/8/1024/1024=1.32MB
采样的图像比RGB模型图像节省了一半的存储空间,因为人眼对色度敏感度不高,省略一些色度后人眼难以区分,为了减少冗余,减少信息量,因此也是当前阶段视频编码的首选采样方式。