YUV顏色詳解

聰莞發表於2019-08-02

RGB顏色編碼

RGB 影像中,每個畫素點都有紅、綠、藍三個顏色通道,其中每個通道都佔用 8 bit,也就是一個位元組,那麼一個畫素點也就佔用 24 bit,也就是三個位元組。

一張 1280 * 720 大小的圖片,就佔用 1280 * 720 * 3 / 1024 / 1024 = 2.63 MB 儲存空間。

YUV顏色編碼

在 YUV空間中,每一個顏色有一個亮度訊號 Y,和兩個色度訊號 U 和V。 如果沒有U/V分量,那麼顯示出來的影像就是黑白的。

對於YUV來說,並不是每個Y分量就對應一個U/V分量,根據不同的取樣格式,可以一個Y分量對應一個U/V分量,也可以多個Y分量共享一個U/V分量。

YUV常見取樣格式

假設原影像結構為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

YUV4:4:4: 即 Y:U:V = 4:4:4 ,表示一個Y分量對應一個U/V分量,取樣完為:Y0U0V0Y1U1V1Y2U2V2Y3U3V3;這種取樣結束後圖片大小跟rgb編碼方式並無區別。

YUV4:2:2: 即 Y:U:V = 4:2:2 ,表示Y 分量和 UV 分量按照 2 : 1 的比例取樣,取樣完為:Y0U0Y1V1Y2U2Y3V3;該方式取樣結束後圖片大小為: (1280 * 720 * 8 + 1280 * 720 * 8/2 + 1280 * 720 * 8/2)/ 8 / 1024 / 1024 = 1.76 MB 。

YUV4:2:0(現在比較常用的): 即 Y:U:V = 4:2:0 ,並不是指只取樣 U 分量而不取樣 V 分量,而是指,在每一行掃描時,只掃描一種色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式取樣: 原始影像: [Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3] [Y4 U4 V4]、[Y5 U5 V5]、 [Y6 U6 V6]、 [Y7 U7 V7] 取樣完: Y0U0Y1Y2U2Y3 Y4V4Y5Y6V6Y7 此時圖片大小變為: (1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 * 2)/ 8 / 1024 / 1024 = 1.32 MB 。

YUV和RGB的轉換:

Y = 0.257R + 0.504G + 0.098B + 16
U = 0.148R - 0.291G + 0.439B + 128
V = 0.439R - 0.368G - 0.071B + 128

B = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R = 1.164(Y - 16) + 1.596(V - 128)
複製程式碼

YUV儲存格式

YUV的儲存格式分為:plannar(平面)和packed(打包)

  • plannar(平面): 先連續儲存所有畫素點的 Y 分量,然後儲存 U 分量,最後是 V 分量。

YU12 和 YV12 格式 YU12 和 YV12 格式都屬於 YUV 420P 型別,即先儲存 Y 分量,再儲存 U、V 分量,區別在於:YU12 是先 Y 再 U 後 V,而 YV12 是先 Y 再 V 後 U 。

YU12 : 也叫做I420(PC端使用) : YYYYYYYY UU VV --> YUV420P

YV12 : YYYYYYYY VV UU --> YUV420P

  • **packed(打包,移動端使用):**每個畫素點的 Y、U、V 分量是連續交替儲存的.

NV12 和 NV21 格式 NV12 和 NV21 格式都屬於 YUV420SP 型別。它也是先儲存了 Y 分量,但接下來並不是再儲存所有的 U 或者 V 分量,而是把 UV 分量交替連續儲存。 NV12 是 IOS 中有的模式,它的儲存順序是先存 Y 分量,再 UV 進行交替儲存。 NV21 是 安卓 中有的模式,它的儲存順序是先存 Y 分量,在 VU 交替儲存。

NV12 : YYYYYYYY UVUV --> YUV420SP

NV21 : YYYYYYYY VUVU --> YUV420SP

開發過程中,有可能出現iOS端的視訊在Android端發生了倒置或者翻轉,那麼就可能是因為兩邊的YUV儲存格式不一樣導致的。

相關文章