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

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