何为YUV

RGB相信大家都明白是什么,也知道怎么用RGB来表示一个颜色。YUV也可以用来表示颜色,可以从RGB中得到,为得是使得亮度跟颜色分开,这样可以兼容黑白电视(只需显示Y的程度)。现代采像一般是把采集的图像信号经分色、分别放大后得到RGB,再经过矩阵转换电路取得亮度信号Y和两个色差信号R-Y(U)、B-Y(V),最后发送端将亮度和发送端三个信号分别进行编码,用同一信道发出去。YUV也是分别需要1个字节来表示Y、U、V,但是可以方便减少采样而使得画质不会太大受损,这样可以大大的减少存储空间。

YUV中的Y

Y表示明亮度(Luminance或者luma),也叫做灰阶值,用来表示黑白的程度。这个值是透过RGB的信号来建立的,方法是将RGB的特定信号叠加在一起,转换公式稍后会说。

YUV中的UV

UV代表色度值(chrominance/chroma),是构成彩色的两个分量。用于描述图片的色彩和饱和度,用于指定像素的颜色。U值也叫做Cr值,反映了RGB输入值的红色部分与RGB信号亮度值之间的差异。V值也叫做Cb值,反映了RGB输入值的蓝色部分与RGB信号亮度之间的差异。

饱和度

饱和度是指色彩的鲜艳程度,也称色彩的纯度。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。纯的颜色都是高度饱和的,如鲜红,鲜绿。混杂上白色,灰色或其他色调的颜色,是不饱和的颜色,如绛紫,粉红,黄褐等。完全不饱和的颜色根本没有色调,如黑白之间的各种灰色

注:photoshop上颜色的其他课外知识

HSB

H(色相):光的波长

S(饱和度):颜色的纯度,比如红色,255,0,0为最纯。如果饱和度设置为50%,那么就变成255,128,128。

B(亮度):物体表面的反光率。比如:亮红是 255,0,0。如果亮度设置为50%,那么就变成 128,0,0.

YUV采样

4:4:4 采样

YUV三个信道抽样率相同,因此在生成的图像里,每个像素三个分量信息完整,经过8比特量化后,未经压缩占用3字节。例如:

四个像素为:

[Y0 U0 V0] [Y1 U1 V1] [Y1 U1 V1] [Y1 U1 V1]

存放的码流为:

Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

映射的像素点为:

[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

4:2:2采样

并不意味着只有Y、Cb而没有Cr分量。它指的是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储,它指的是对每行扫描线来说,只有一种色度分量以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]

存储的码流为(YUVY,packed格式):

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]

YUV的存储格式

通常有两大类:打包格式(packed)和平面格式(planar),前者将YUV分量存放在同个数组中,通常是几个相邻的像素组成一个宏像素;后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。

YUV422 Plannar

YUV422 Semi-Planar(半平面格式)

NV12(UV)和NV21(VU)属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane

YUV422 interleaved (packed模式)

4、YUV420 Plannar(YV12,YU12)

问答:

YUV 420数据为什么能省下内存

表示4组Y对应1组UV。
以 720x480的YUV图像为例子,解释一下数据存储格式。
720x480如果是RGB格式存储,R、G、B分别对应一个字节。所以需要 720*480*3个字节。
如果是yuv 420存储格式 4组y共用一组uv(共用的U是第一行第一个像素的U,V是第二行第二个像素的V)。 y占用一个字节,u占用一个字节,v占用一个字节。

下面这个图经常误导人。下面这个图并不是像素的排列方式。注意不是像素的排列方式。一个像素是会同时显示Y以及UV的。下面这个图只是为了说明四个Y对应一个UV。说明亮度、色度的采样模式。四个像素共用的U是第一行第一个像素的U,V是第二行第二个像素的V。

无论怎样yuv的格式如何,一个像素依然是要由一个Y(一个字节),U(一个字节)、V(一个字节来显示)来表示。 420的格式是说 隔壁的四个像素分别有4个y,然后要用的U跟V是同一样的数据。 这样4个像素占用的内存就由以前的 4*3 (RGB)个字节变为。4个Y字节+1个UV字节就能表示。平均下来就是一个像素占用 8(一个Y一个字节)+ 16(U+V)/4 = 12位。

所以420能比RGB剩下很多存储空间。

YUV 420的存储格式

YUV的存储格式分为打包(packed)格式和平面(planar)格式

YUV420P是平面格式,分为I420和YV12。他们之间有什么不同?

I420格式(YUV的标准格式)和YV12格式的不同处在U平面和V平面的位置不同。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P

NV12跟NV21有什么区别

NV12根NV21都是420的半平面格式,他们的区别只是在于U和V的存储顺序不一致

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