对一种颜色进行编码的方法统称为"颜色空间"或"色域",RGB和YUV,都是颜色空间的种类,
Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠
分量视频信号(色差信号),通常采用YCbCr和YPbPr两种标识,
YUV(YCbCr)是525i/625i(480i/576i)隔行分量输入接口
YPbPr是从480i到720p的分量输入接口标准(不区分隔行和逐行),隔行分量端子和逐行分量端子共用,端子标识为YPbPr,无论隔行还是逐行分量信号都从这个端口输入。
Y'PbPr是为了满足高质量视频传输而设计的色彩分量形式及接口形式,采用并行传输的方式。PbPr也是由B'-Y'及R'-Y'经过限幅得到的,目前,这种接口多见于模拟分量录像机、高清摄录一体机及DVD播放机等。模拟分量传输绕过了PAL编码与解码,减轻了亮/色串扰等编解码对图像的损失,但传输距离受到限制。
Y'CbCr是数字电视标准化时,为了兼容亮度、色差这种色彩编码方式而采用的一种类似于Y'PbPr的分量形式。
YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL)。YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。与RGB视频信号传输相比,它最大的优点在于只需占用极少的带宽(RGB要求三个独立的视频信号同时传输)。
其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;
而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
“亮度”是通过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面—色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了GB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异; YUV经常有另外的名字,YCbCr ,其中Y与YUV 中的Y含义一致,Cb , Cr同样都指色彩,,只是在表示方法上不同而已,Cb Cr 就是本来理论上的“分量/色差”的标识。C代表分量(是component的缩写)Cr、Cb分别对应r(红)、b(蓝)分量信号,Y除了g(绿)分量信号,还叠加了亮度信号。
以下是标准公式
RGB 转换成 YUV
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) +16
Cr = V =(0.439 * R) - (0.368 * G) - (0.071 * B) +128
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
YUV 转换成 RGB
B =1.164(Y - 16) + 2.018(U - 128)
G =1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R =1.164(Y - 16) + 1.596(V - 128)
RGB取值范围均为0~255,Y=0~255,U=-122~+122,V=-157~+157
以下是经过简化的公式,运算量比上述公式要小一些。
RGB转YUV
Y =0.299R + 0.587G + 0.114B
U'=(BY)*0.565
V'=(RY)*0.713
YUV转RGB
R = Y+ 1.403V'
G = Y- 0.344U' - 0.714V'
B = Y+ 1.770U'
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0;
用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。
先记住下面这段话,以后提取每个像素的YUV分量会用到。
YUV4:4:4采样,每一个Y对应一组UV分量
YUV4:2:2采样,每两个Y共用一组UV分量
YUV4:2:0采样,每四个Y共用一组UV分量
4:4:4 表示色度值(UV)没有减少采样。即Y,U,V各占一个字节,加上Alpha通道一个字节,总共占4字节.这个格式其实就是24bpp的RGB格式了。
4:2:2 表示UV分量采样减半,比如第一个像素采样Y,U,第二个像素采样Y,V,依次类推,这样每个点占用2个字节.二个像素组成一个宏像素.
4:2:0 这种采样并不意味着只有Y,Cb而没有Cr分量,这里的0说的U,V分量隔行才采样一次。比如第一行采样 4:2:0 ,第二行采样 4:0:2 ,依次类推...在这种采样方式下,每一个像素占用16bits或10bits空间.
4:1:1 可以参考4:2:2分量,是进一步压缩,每隔四个点才采一次U和V分量。一般是第0点采Y,U,第1点采Y,第3点采YV,第四点采Y,依次类推。
下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。
YUYV格式
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。
UYVY格式
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。
YUV422P格式
YUV422P也属于YUV422的一种,它是一种Plane模式,即打包模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01而言,其Cb、Cr的值均为
Cb00、Cr00。
YU12和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。
NV12,NV21格式
NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
I420格式
I420就是YUV420P格式;存储方式参考YUV422P;
一般来说,直接采集到的视频数据是RGB24的格式,RGB24一帧的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,如果是I420(即YUV标准格式4:2:0)的数据量是 size=width×heigth×1.5 Bit。
在采集到RGB24数据后,需要对这个格式的数据进行第一次压缩。即将图像的颜色空间由RGB2YUV。因为,X264在进行编码的时候需要标准的YUV(4:2:0)。但是这里需要注意的是,虽然YV12也是(4:2:0),但是YV12和I420的却是不同的,在存储空间上面有些区别。如下:
YV12:亮度(行×列)+U(行×列/4) +V(行×列/4)
I420:亮度(行×列)+V(行×列/4) +U(行×列/4)
可以看出,YV12和I420基本上是一样的,就是UV的顺序不同。
YUV420 planar数据,以720×488大小图象YUV420 planar为例,其存储格式是:共大小为(720×480×3>>1)字节,
分为三个部分:Y,U和V
Y分量: (720×480)个字节
U(Cb)分量:(720×480>>2)个字节
V(Cr)分量:(720×480>>2)个字节
三个部分内部均是行优先存储,三个部分之间是Y,U,V 顺序存储。即YUV数据的
0 - 720×480字节是Y分量值,
720×480 - 720×480×5/4字节是U分量
720×480×5/4 - 720×480×3/2字节是V分量。
4:2:2 和4:2:0 转换:
最简单的方式:
YUV4:2:2 --->YUV4:2:0 Y不变,将U和V信号值在行(垂直方向)在进行一次隔行抽样。 YUV4:2:0 --->YUV4:2:2 Y不变,将U和V信号值的每一行分别拷贝一份形成连续两行数据。