YUV444,YUV420P,YUV420SP,YUV422P,YUV422SP,NV12,NV21,NV16,NV61等格式区分与存储简介

一、基础知识:

概述

YUV是颜色编码方式,常用于视频及图像处理中。

其中的YUV是三个分量。“Y”表示明亮度(Luminance或Luma),也就是灰度值。“U”和“V” 表示的是彩色信息,分别为色度和浓度(Chrominance和Chroma)。

由于相邻的两个像素,数据差异不大,所以,丢弃相邻像素的部分数据对于整体影响不大。同时,丢弃数据,还节省了空间便于存储。人对亮度比较敏感,而对色彩不怎么敏感。所以,每个像素的亮度Y数据是绝对不动的,而色差数据UV可以进行丢弃。没有UV信息,一样可以显示完整的图像,只不过是黑白的。因此在数据的存储上,根据数据丢弃方式(采样方式)的不同,YUV又出现了不同的格式。

 

采样方式

采样是将4个像素作为一组进行的。原因在于:图像每行所占字节数必须是4的倍数,才能保证无误的转换。

YUV主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。而Android中常用的YUV420格式,即指YUV4:2:0。

YUV的分量数据各占用8位(各占1字节),在不丢失数据的情况下,4个像素(12字节)的数据依次为,

Y0U0V0    Y1U1V1    Y2U2V2   Y3U3V3

(1)YUV444

存储时,数据为Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3。

YUV444,4个像素里的数据有4个Y,4个U, 4个V,未丢弃任何数据。

(2)YUV422

存储时,数据为Y0U0 Y1U1 Y2V2 Y3V3,即YUV422,4个像素里的数据有4个Y,2个U, 2个V。

YUV422的采样方式为:奇数像素丢弃V,偶数像素丢弃U。

YUV422为横向丢弃数据的采样方式。由于邻近像素的相似性不仅局限于横向,数据还可以进一步纵向丢弃,以减少存储空间。因此,YUV420便出现了。

(3)YUV420

YUV420为横向纵向同时丢弃数据的采样方式。以一个YUV444格式的4x4数据为例

Y00U00V00    Y01U01V01    Y02U02V02   Y03U03V03

Y10U10V10    Y11U11V11    Y12U12V12   Y13U13V13

Y20U20V20    Y21U21V21    Y22U22V22   Y23U23V23

Y30U30V30    Y31U31V31    Y32U32V32   Y33U33V33

以YUV420格式丢弃数据后,将变为

Y00U00    Y01    Y02U02   Y03

Y10V10    Y11    Y12V12   Y13

Y20U20    Y21    Y22U22   Y23

Y30V30    Y31   Y32V32   Y33

YUV420的采样方式为:

(i)偶数像素丢弃UV。

(ii)在(i)的基础上,奇数行进一步丢弃V,偶数行进一步丢弃U。

 

存储格式

YUV有两种存储格式。

(1)紧缩格式(packed formats):将Y、U、V值存储成Macro Pixels数组。

(2)平面格式(planar formats):将Y、U、V的三个分量分别存放在不同的矩阵中。

需要说明的是,Android NDK使用平面格式存储YUV数据,可以调用AImage_getPlaneData分别获取Y、U、V的数据。其planeIdx分别为0,1,2。

media_status_t AImage_getPlaneData(
        const AImage* image, int planeIdx,
        /*out*/uint8_t** data, /*out*/int* dataLength);

二、YUV444,YUV422,YUV420区别:

 

1. YUV444,即YUV 4:4:4采样,每一个Y对应一组UV分量8+8+8 = 24bits,3个字节。

2. YUV422,即YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。

3. YUV420,即YUV 4:2:0采样,每四个Y共用一组UV分量一个YUV占8+2+2 = 12bits  1.5个字节。

对应如下图:

 

三、YUV420,YUV420P和YUV420SP

  • YUV420有打包格式(Packed),即YUV是按像素点存储的,即YUYVYUYVYUYV这样顺序存储。

  • 同时,还有平面格式(Planar),即Y、U、V是分开存储的,每个分量占一块地方,即YYYYYYY.......UUUU....VVVV...,根据U、V的顺序,又有2种,U前V后即YUV420P,也叫I420,又叫YU12。V前U后,叫YV12(YV表示Y后面跟着V,12表示12bit)

  • 还有半平面格式(Semi-planar),即Y单独占一块地方,但其后U、V又紧挨着排在一起,即YYYYYYY.......UVUVUVUV......     根据U、V的顺序,又有2种,U前V后叫NV12,在国内好像很多人叫它为YUV420SP格式;V前U后叫NV21。

1. YUV420P(Packed),又叫YUYV420,即YUV 4:2:0采样,每四个Y共用一组UV分量一个YUV占8+2+2 = 12bits  1.5个字节。

    存储:YUV交错存储,按像素点存储。如YUVYUVYUVYUV

2. YUV420P(planar),   根据U、V的顺序,又有2种,U前V后即YUV420P又叫I420YU12,V前U后,叫YV12(YV表示Y后面跟      着V,12表示12bit)

    YUV 4:2:0采样,每四个Y共用一组UV分量一个YUV占8+2+2 = 12bits  1.5个字节。

    存储:YUV分开存储,如YYYYYYYYYYY......UUUUU...VVVVV...,如下图:

              对于V前U后,则:YYYYYYYYYYY......VVVVV...UUUUU...

    

3. YUV420SP(planar)根据U、V的顺序,又有2种,U前V后叫NV12,在国内好像很多人叫它为YUV420SP格式;V前U后            叫NV21

    YUV 4:2:0采样,每四个Y共用一组UV分量一个YUV占8+2+2 = 12bits  1.5个字节。

    存储:YUV分开存储,如YYYYYYYYYYY......UVUVUVUVUV.....,如下图:

              对于V前U后,则:YYYYYYYYYYY......VUVUVUVUVU...

     

四、YUV422,YUV422P和YUV422SP

同理YUV422的,也类似于YUV420,简介如下:

  • YUV422有打包格式(Packed),即YUV是按像素点存储的,即YUYVYUYVYUYV这样顺序存储。

  • 同时,还有平面格式(Planar),即Y、U、V是分开存储的,每个分量占一块地方,即YYYYYYY.......UUUU....VVVV...,根据U、V的顺序,又有2种,U前V后即YUV422P,也叫I422,又叫YU16。V前U后,叫YV16(YV表示Y后面跟着V,16表示16bit)

  • 还有半平面格式(Semi-planar),即Y单独占一块地方,但其后U、V又紧挨着排在一起,即YYYYYYY.......UVUVUVUV......     根据U、V的顺序,又有2种,U前V后叫NV16,在国内好像很多人叫它为YUV422SP格式;V前U后叫NV61。不过这种格式似乎不太受VLC欢迎(具体可去看看VLC的wiki)。

1. YUV422P(Packed),又叫YUYV422,即YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。

    存储:YUV交错存储,按像素点存储。如YUVYUVYUVYUV

2. YUV422P(planar),   根据U、V的顺序,又有2种,U前V后即YUV422P又叫I422YU16,V前U后,叫YV16(YV表示Y后面跟      着V,16表示16bit)

    即YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。

    存储:YUV分开存储,如YYYYYYYYYYY......UUUUU...VVVVV...

              对于V前U后,则:YYYYYYYYYYY......VVVVV...UUUUU...

3. YUV422SP(planar)根据U、V的顺序,又有2种,U前V后叫NV16,在国内好像很多人叫它为YUV422SP格式;V前U后            叫NV61

    即YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。

    存储:YUV分开存储,如YYYYYYYYYYY......UVUVUVUVUV.....,如下图:

              对于V前U后,则:YYYYYYYYYYY......VUVUVUVUVU...

五、一些常用格式介绍:

1、YUV444

(1)YUV444p:YYYYYYYYY VVVVVVVVV UUUUUUUU

2、YUV422

(1)YUV422p:

         YV16:                              YYYYYYYY VVVV UUUU       (V前U后)

        YUV422p或I422YU16: YYYYYYYY UUUU VVVV       (U前V后)

(2)YUV422sp:

          NV61:YYYYYYYY VUVUVUVU      (V前U后)

          NV16:YYYYYYYY UVUVUVUV      (U前V后)

(2)YUVY:YUYV YUYV YUYV YUYV

(3)UYVY:UYVY UYVY UYVY UYVY

3、YUV420

(1)YUV420p:

YV12:YYYYYYYY VV UU

I420:YYYYYYYY UU VV

(2)YUV420sp:

NV12:YYYYYYYY UVUV

NV21:YYYYYYYY VUVU

reference:https://www.jianshu.com/p/e67f79f10c65

                   https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

                   https://www.twblogs.net/a/5d535c8dbd9eee541c317976

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章