YUVRGB 一样,也是一种颜色编码方法,只是它们的侧重点不同。YUV 标准是根据人眼视觉系统对亮度和色度的敏感度的不同,主要侧重的是图片的亮度信息,允许适当降低图片的色度信息;而 RGB 标准则是根据人眼感光细胞对光的感知程度,侧重点在于色度信息。

三原色的原理不是出于物理原因,而是由于生理原因造成的。人的眼睛内有几种辨别颜色的锥形感光细胞,如果辨别黄色的细胞略大于辨别绿色的细胞,人的感觉是黄色;如果辨别黄绿色的细胞受到的刺激大大高于辨别绿色的细胞,人的感觉是红色。虽然三种细胞并不是分别对红色、绿色和蓝色最敏感,但这三种光可以分别对三种锥形细胞产生刺激。

由于 YUV 可以适当减少一些人眼不明感的色度信息,所以通常来说同样分辨率的图片,其 YUV 格式的存储大小相比 RGB 格式来说会少很多。因此 YUV 格式传输时占用的带宽就少,传输效率也就更高。基于这个优点,YUV 格式在无人机的图传,视频传输等用到的就比较多。

YUV常见采样率

YUV 格式也常叫 YCbCr 格式, 其中的 Y 表示亮度,UVCbCr 同样都表示色度,Cb 指蓝色色度,Cr 指红色色度。

YUV 的采样率一般有如下四种: YUV 格式详解 - 图1采样格式分别如下图所示:
yuv_sampling.png
其中,灰色实心圆代表 Y 分量,红色空心圆代表 U 分量,蓝色空心圆代表 V 分量。

所以根据上图,可知:

  • YUV444 :Y分量与UV分量是在水平和垂直方向上都是 1:1 的关系,就是说一个Y分量对应一个UV分量;
  • YUV422 :Y分量与U****V分量在水平方向上是 2:1 的关系,在垂直方向上是 1:1 的关系,就是说两个Y分量共用一个UV分量;
  • YUV420 :Y分量与U****V分量在水平方向上是 2:1 的关系,也就是说在水平方向上,U,V是隔行采样的,第 i 上采样 U 分量,不采样 V 分量,则第 i+1 行就采样 V 分量不采样 U 分量。而在垂直方向上,Y分量与UV分量也是 2:1 的关系,就是说每四个Y分量共用一个UV分量;
  • YUV411 :Y分量与U****V分量在水平和垂直方向上都是 2:1 的关系,和YUV420一样,每四个Y分量共用一个UV分量;

YUV常见存储格式

YUV的存储格式主要有两种: YUV 格式详解 - 图3我们以常见的YUV420采样率来说明 packed 和 planar 的内存排列是什么样的。
yuv_format(1).png
可以看到,上图中的 packed 格式只有UV分量是交叉的,Y分量并没有和UV分量进行交叉存储;当然,Y分量也是可以和UV分量进行交叉存储,这里只是为了说明 packed 和 planar 格式内存布局之间的区别。

实际上,YUV各分量之间的排列顺序也是可以不同的,不同的排列顺序其实也对应了不同的YUV格式。所以根据不同采样率,不同存储格式,不同的组成顺序之间的组合,YUV有各种各样的格式,但其实你只要理解了YUV的采样率,存储格式后,不管那种YUV格式,对你来说应该都不是难事。

各种YUV格式

YUV有四种采样率,两种存储格式,不同的组成顺序,组合起来可以有非常多的YUV格式,这里对几种常见的格式做个总结,如下图: YUV 格式详解 - 图5

Planar模式

planar模式也被称为triplanar模式,该模式对于YUV三个分量是分开存储的,也就是说,有一个表负责存储亮度分量Y的值,以及另外两个独立的表用来存储色度分量UV的值。

I420 格式

I420格式属于YUV420Planar的一种,它首先存储Y分量,然后是U分量,最后是V分量。并且其UV分量在水平和垂直方向上都是每2个像素采样一个,Y分量是每个像素都采样。也就是说,对于2x2大小的像素方块,采样4个Y分量,但是仅采样一个UV分量。可知这四个像素块共占用4*8+8+8=48(bit),它的像素深度也就等于12bit

举例说明,若是单个像素的 I420 图片,它的YUV如下(每个字母代表1bit,planar模式都一样,后面对planar模式的格式不再画此图):
I420.jpg
同样的,对于有N个像素的 I420 图片,则如下:
I420N.jpg
I420 常用在VLC中,大多数的视频解码器输出的原始格式都是 I420 格式。J420 格式和 I420 完全一样,只是J420Y分量具有完整的 0-255 的范围。

YV12 格式

从上面的思维导图也可以看出来,YV12 格式其实和 I420 格式是一样的,不同的地方就是 UV 的顺序不一样,I420 是先 UVYV12 就像它名字表达的一样,“YV” 表示它们的顺序:先 Y,然后 V(最后U);“12” 表示它的像素深度是 12bit/pixel

I422 格式

和 I420 格式一样,I422 也是先存储Y分量,然后是UV分量,但是,在 I422 格式中,其UV分量只在水平方向上是每两个像素采样一个,而在垂直方向上和Y分量是一样的。对于 2x2 大小的像素方块,采样4个Y分量,2个U分量,2个V分量,其深度 16bit/pixel
某些视频编解码器支持I422格式以实现更高质量的视频编码。J422 格式和 I422 完全一样,只是J422Y分量具有完整的 0-255 的范围。

I444 格式

和前面的 I420,I422 一样,I444 也是按 YUV 的顺序存储的,只是其UV分量的采样率在水平和垂直方向都和Y分量保持一致,也就是每4个像素采样4个Y分量,4个U分量,4个V分量。所以它的深度是 24bit/pixel
只有很少数的视频编码器支持 I444 格式。

YV24 格式

和前面 YV12 与 I420 格式的关系一样,YV24 格式其实和 I444 格式也完全一样,只是 YV24 格式先V后U,“24”表示它的像素深度是 24bit/pixel

Semi-Planar 模式

Semi-Planar模式表示亮度分量Y是单独存储的,色度分量UV是一起交叉存储的,可以是UV顺序,也可以是VU顺序。也就是说它有两个planes。

NV12/21 格式

NV12 格式也是先亮度分量Y,然后是交错的UV分量,你可以把它看成是UV分量交错存储的 I420 格式,如下图:

单像素:
nv12.jpg
N像素:
nv12n.jpg
NV21格式和NV12格式是一样的,只是它们的UV顺序不同,NV21格式是先 VU

NV16/NV61 格式

NV16格式也是先亮度分量Y,然后是交错的UV分量,类比NV12和I420的关系,你可以把它看成是UV分量交错存储的 I422 格式,同样的,NV61和NV16的区别就是UV分量顺序的不同,NV61是先 VU

NV24/NV42 格式

同理,NV24 可以看成是UV分量交错存储的 I444 格式,NV42 同理。

Packed 模式

Packed模式通常只有一个plane,也就是说亮度分量Y和色度分量UV全部都是交叉存储的,packed模式在 webcams 中非常流行。对于硬件来说,使用分开的planes效率更地下:每个像素有多次内存访问。

YUVY 格式

YUVY格式就像它的名字表达的那样,按照YUVY分量的顺序存储,如下图:
yuvy.jpg

VYUY 格式

VYUY格式就像它的名字表达的那样,按照VYUY分量的顺序存储,如下图:
vyuy.jpg

UYVY/Y422/UYNV 格式

UYVY,Y422,UYNV 这三个名称都表示同一种格式,如下:
uyvy.png

YUYV/YUY2/V422/YUNV 格式

YUYV,YUY2,V422,YUNV 这几个名称也表示同一中格式,如下:
yuyv.jpg