YUV簡介

最近項目中遇到YUV->RGB的轉換,順便對YUV進行了一下簡單瞭解。解決了以下疑問。

(1)什麼是YUV。

(2)YUVxxx採樣格式是什麼含義。

(3)爲什麼可以存在xxx採樣格式。

(4)YUV的存儲格式。

話歸正題。

 

概述

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);

 

題外話:Rotate

之所以說Rotate,是因爲在使用googlesample ndk camer時被坑了,所以跟同事特意理了一下思路。耗時較長,因此特意一併記錄。

圖像的0/90/180/270角度旋轉(android圖像的旋轉,爲順時針旋轉),即爲矩陣座標的轉換。

將2行3列的像素矩陣,且旋轉角度爲270圖像A擺正爲圖像B。

A00 A01 A02
A10 A11 A12
B00 B01
B10 B11
B20 B21

即,將圖A順時針旋轉90度,得到圖B

A00->B01,A01->B11,A02->B21,

A10->B00,A11->B10,A12->B20

若用r,c,w,h分別表示B圖的行索引,列索引,圖像寬和高,則座標轉換公式應爲:B[r][c]=A[w-1-c][r]。

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