天天看點

一文讀懂 YUV 的采樣與格式

作者:星隕

來源:

音視訊開發進階 YUV 是一種顔色編碼方法,和它等同的還有 RGB 顔色編碼方法。

RGB 顔色編碼

RGB 三個字母分别代表了 紅(Red)、綠(Green)、藍(Blue),這三種顔色稱為 三原色,将它們以不同的比例相加,可以産生多種多樣的顔色。

在圖像顯示中,一張 1280 * 720 大小的圖檔,就代表着它有 1280 * 720 個像素點。其中每一個像素點的顔色顯示都采用 RGB 編碼方法,将 RGB 分别取不同的值,就會展示不同的顔色。

一文讀懂 YUV 的采樣與格式

RGB 圖像中,每個像素點都有紅、綠、藍三個原色,其中每種原色都占用 8 bit,也就是一個位元組,那麼一個像素點也就占用 24 bit,也就是三個位元組。

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

YUV 顔色編碼

YUV 顔色編碼采用的是 明亮度 和 色度 來指定像素的顔色。

其中,Y 表示明亮度(Luminance、Luma),而 U 和 V 表示色度(Chrominance、Chroma)。

而色度又定義了顔色的兩個方面:色調和飽和度。

使用 YUV 顔色編碼表示一幅圖像,它應該下面這樣的:

一文讀懂 YUV 的采樣與格式

和 RGB 表示圖像類似,每個像素點都包含 Y、U、V 分量。但是它的 Y 和 UV 分量是可以分離的,如果沒有 UV 分量一樣可以顯示完整的圖像,隻不過是黑白的。

對于 YUV 圖像來說,并不是每個像素點都需要包含了 Y、U、V 三個分量,根據不同的采樣格式,可以每個 Y 分量都對應自己的 UV 分量,也可以幾個 Y 分量共用 UV 分量。

RGB 到 YUV 的轉換

對于圖像顯示器來說,它是通過 RGB 模型來顯示圖像的,而在傳輸圖像資料時又是使用 YUV 模型,這是因為 YUV 模型可以節省帶寬。是以就需要采集圖像時将 RGB 模型轉換到 YUV 模型,顯示時再将 YUV 模型轉換為 RGB 模型。

RGB 到 YUV 的轉換,就是将圖像所有像素點的 R、G、B 分量轉換到 Y、U、V 分量。

有如下公式進行轉換:

一文讀懂 YUV 的采樣與格式
一文讀懂 YUV 的采樣與格式

此時的轉換結束後,每個像素點都有完整的 Y、U、V 分量。而之前提到 Y 和 UV 分量是可以分離的,接下來通過不同的采樣方式,可以将圖像的 Y、U、V 分量重新組合。

接下來的不同采樣格式都是在一張圖像所有像素的 RGB 轉換到 YUV 基礎上進行的。

YUV 采樣格式

YUV 圖像的主流采樣方式有如下三種:

  • YUV 4:4:4 采樣
  • YUV 4:2:2 采樣
  • YUV 4:2:0 采樣

YUV 4:4:4 采樣,意味着 Y、U、V 三個分量的采樣比例相同,是以在生成的圖像裡,每個像素的三個分量資訊完整,都是 8 bit,也就是一個位元組。

如下圖所示:

一文讀懂 YUV 的采樣與格式

其中,Y 分量用叉表示,UV 分量用圓圈表示。

舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 
最後映射出的像素點依舊為 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]      

可以看到這種采樣方式的圖像和 RGB 顔色模型的圖像大小是一樣,并沒有達到節省帶寬的目的,當将 RGB 圖像轉換為 YUV 圖像時,也是先轉換為 YUV 4:4:4 采樣的圖像。

YUV 4:2:2 采樣,意味着 UV 分量是 Y 分量采樣的一半,Y 分量和 UV 分量按照 2 : 1 的比例采樣。如果水準方向有 10 個像素點,那麼采樣了 10 個 Y 分量,而隻采樣了 5 個 UV 分量。

一文讀懂 YUV 的采樣與格式
舉個例子 :
 假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
 那麼采樣的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3 
 其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一個采集一個。
 最後映射出的像素點為 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]      

采樣的碼流映射為像素點,還是要滿足每個像素點有 Y、U、V 三個分量。但是可以看到,第一和第二像素點公用了 U0、V1 分量,第三和第四個像素點公用了 U2、V3 分量,這樣就節省了圖像空間。

一張 1280 * 720 大小的圖檔,在 YUV 4:2:2 采樣時的大小為:

(1280 * 720 * 8 + 1280 * 720 * 0.5 * 8 * 2)/ 8 / 1024 / 1024 = 1.76 MB 。

可以看到 YUV 4:2:2 采樣的圖像比 RGB 模型圖像節省了三分之一的存儲空間,在傳輸時占用的帶寬也會随之減少。

YUV 4:2:0 采樣,并不是指隻采樣 U 分量而不采樣 V 分量。而是指,在每一行掃描時,隻掃描一種色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采樣。比如,第一行掃描時,YU 按照 2 : 1 的方式采樣,那麼第二行掃描時,YV 分量按照 2:1 的方式采樣。對于每個色度分量來說,它的水準方向和豎直方向的采樣和 Y 分量相比都是 2:1 。

一文讀懂 YUV 的采樣與格式

假設第一行掃描了 U 分量,第二行掃描了 V 分量,那麼需要掃描兩行才能夠組成完整的 UV 分量。

舉個例子 :
假設圖像像素為:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那麼采樣的碼流為:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8
其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一行按照 2 : 1 進行采樣。
最後映射出的像素點為:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]      

從映射出的像素點中可以看到,四個 Y 分量是共用了一套 UV 分量,而且是按照 2*2 的小方格的形式分布的,相比 YUV 4:2:2 采樣中兩個 Y 分量共用一套 UV 分量,這樣更能夠節省空間。

一張 1280 * 720 大小的圖檔,在 YUV 4:2:0 采樣時的大小為:

(1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 * 2)/ 8 / 1024 / 1024 = 1.32 MB 。

可以看到 YUV 4:2:0 采樣的圖像比 RGB 模型圖像節省了一半的存儲空間,是以它也是比較主流的采樣方式。

YUV 存儲格式

說完了采樣,接下來就是如何把采樣的資料存儲起來。

YUV 的存儲格式,有兩種:

  • planar  平面格式
    • 指先連續存儲所有像素點的 Y 分量,然後存儲 U 分量,最後是 V 分量。
  • packed  打包模式
    • 指每個像素點的 Y、U、V 分量是連續交替存儲的。

根據采樣方式和存儲格式的不同,就有了多種 YUV 格式。這些格式主要是基于 YUV 4:2:2 和 YUV 4:2:0 采樣。

常見的基于 YUV 4:2:2 采樣的格式如下表:

YUYV 格式
UYVY 格式
YUV 422P 格式

常見的基于 YUV 4:2:0 采樣的格式如下表:

YUV 420P 類型 YV12 格式 YU12 格式
YUV 420SP 類型 NV12 格式 NV21 格式

更多的 YUV 格式資訊參考這裡:YUV pixel formats

基于 YUV 4:2:2  采樣的格式

YUV 4:2:2 采樣規定了 Y 和 UV 分量按照 2: 1 的比例采樣,兩個 Y 分量公用一組 UV 分量。

YUYV 格式是采用打包格式進行存儲的,指每個像素點都采用 Y 分量,但是每隔一個像素采樣它的 UV 分量,排列順序如下:

Y0 UO Y1 V0  Y2 U2 Y3 V2

Y0 和 Y1 公用 U0 V0 分量,Y2 和 Y3 公用 U2 V2 分量….

一文讀懂 YUV 的采樣與格式

UYVY 格式也是采用打包格式進行存儲,它的順序和 YUYV 相反,先采用 U 分量再采樣 Y 分量,排列順序如下:

U0 Y0 V0 Y1 U2 Y2 V2 Y3

根據 UV 和 Y 的順序還有其他格式,比如,YVYU 格式,VYUY 格式等等,原理大緻一樣了。

一文讀懂 YUV 的采樣與格式

YUV 422P 格式,又叫做 I422,采用的是平面格式進行存儲,先存儲所有的 Y 分量,再存儲所有的 U 分量,再存儲所有的 V 分量。

基于 YUV 4:2:0  采樣的格式

基于 YUV 4:2:0 采樣的格式主要有 YUV 420P 和 YUV 420SP 兩種類型,每個類型又對應其他具體格式。

YUV 420P 和 YUV 420SP 都是基于  Planar 平面模式 進行存儲的,先存儲所有的 Y 分量後, YUV420P 類型就會先存儲所有的 U 分量或者 V 分量,而 YUV420SP 則是按照 UV 或者 VU 的交替順序進行存儲了,具體檢視看下圖:

YUV420SP 的格式:

一文讀懂 YUV 的采樣與格式

YUV420P 的格式:

一文讀懂 YUV 的采樣與格式

YU12 和 YV12 格式

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

YV 12 的存儲格式如下圖所示:

一文讀懂 YUV 的采樣與格式

YU 12 又稱作 I420 格式,它的存儲格式就是把 V 和 U 反過來了。

NV12 和 NV21 格式

NV12 和 NV21 格式都屬于 YUV420SP 類型。它也是先存儲了 Y 分量,但接下來并不是再存儲所有的 U 或者 V 分量,而是把 UV 分量交替連續存儲。

NV12 是 IOS 中有的模式,它的存儲順序是先存 Y 分量,再 UV 進行交替存儲。

一文讀懂 YUV 的采樣與格式

NV21 是 安卓 中有的模式,它的存儲順序是先存 Y 分量,在 VU 交替存儲。

小結

以上就是關于 YUV 的知識總結,你有看明白了嘛?

參考

  1. https://blog.csdn.net/grow_mature/article/details/9004548
  2. http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html
  3. https://blog.csdn.net/MrJonathan/article/details/17718761
  4. https://blog.csdn.net/wudebao5220150/article/details/13295603
  5. https://msdn.microsoft.com/zh-cn/library/ms867704.aspx
  6. https://www.fourcc.org/yuv.php
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
一文讀懂 YUV 的采樣與格式

繼續閱讀