YUV數據格式與YUV_420_888

最近在準備做Android Camera2相關應用,剛好也碰上了YUV格式相關的問題,所以還是寫一篇博客理解YUV格式數據。

介紹

YUV是一種顏色空間,基於YUV的顏色編碼是流媒體的常用編碼方式。

YUV是編譯true-color顏色空間(color space)的種類,Y'UV, YUV, YCbCr,YPbPr等專有名詞都可以稱爲YUV,彼此有重疊。“Y”表示明亮度(Luminance、Luma),“U”和“V”則是色度、濃度(Chrominance、Chroma),Y′UV, YUV, YCbCr, YPbPr所指涉的範圍,常有混淆或重疊的情況。

YUV格式有兩大類:planar和packed。

  • 平面格式(planar formats) :對於planar的YUV格式,先連續存儲所有像素點的Y,緊接着存儲所有像素點的U,隨後是所有像素點的V,如 YYYY YYYY UU VV。

  • 緊縮格式(packed formats):對於packed的YUV格式,每個像素點的Y,U,V是連續交替存儲的,如YUV YUV YUV YUV,這種排列方式跟 RGB 很類似。

歷史

Y'UV的發明是由於彩色電視與黑白電視的過渡時期。黑白視頻只有Y(Luma,Luminance)視頻,也就是灰階值。到了彩色電視規格的制定,是以YUV/YIQ的格式來處理彩色電視圖像,把UV視作表示彩度的C(Chrominance或Chroma),如果忽略C信號,那麼剩下的Y(Luma)信號就跟之前的黑白電視頻號相同,這樣一來便解決彩色電視機與黑白電視機的兼容問題。Y'UV最大的優點在於只需佔用極少的帶寬。

因爲UV分別代表不同顏色信號,所以直接使用R與B信號表示色度的UV。 也就是說UV信號告訴了電視要偏移某象素的的顏色,而不改變其亮度。 或者UV信號告訴了顯示器使得某個顏色亮度依某個基準偏移。 UV的值越高,代表該像素會有更飽和的顏色。

彩色圖像記錄的格式,常見的有RGB、YUV、CMYK等。彩色電視最早的構想是使用RGB三原色來同時傳輸。這種設計方式是原來黑白帶寬的3倍,在當時並不是很好的設計。RGB訴求於人眼對色彩的感應,YUV則着重於視覺對於亮度的敏感程度,Y代表的是亮度,UV代表的是彩度(因此黑白電影可省略UV,相近於RGB),分別用Cr和Cb來表示,因此YUV的記錄通常以Y:UV的格式呈現。

將一張圖片的Y、U、V數據單獨顯示就會如下圖所示:

常見YUV格式

YUV的存儲格式其實與其採樣的方式密切相關,主流的採樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0。

以黑點表示採樣該像素點的Y分量,以空心圓圈表示採用該像素點的UV分量

YUV444

4:4:4表示完全取樣,每個像素點都採樣單獨的 YUV 分量信息,包含了最全面的 YUV 信息。

YUV422

在 YUV444 編碼的基礎上採用 2 * 1 的矩陣進行二次取樣,也就是在水平方向上隔一列採樣一次 UV 信息,在垂直方向上進行完全取樣,每兩個Y共用一組UV分量。

  • YUYV格式

    字節排列 : YUYV YUYV YUYV YUYV

  • UYVY 格式

    字節排列 : UYVY UYVY UYVY UYVY

  • YUV422P格式

    字節排列 :YYYY YYYY UUUU VVVV

YUV420

解決 YUV444 佔用空間過大問題,也是最常用的採樣格式。在 YUV444 格式的基礎上使用 2 * 2 矩陣對像素點進行二次取樣,4 個像素點具有單獨 Y 分量且共享同一個 UV 信息,總 6 字節。一幀圖像佔用總空間 (W * H + W * H / 2) bytes,比 YUV444 少一半空間。

  • I420格式 字節排列 YYYY YYYY UU VV,全部都是平面型排列

  • NV21格式 字節排列 YYYY YYYY UV UV,Y 平面和 UV 平面, UV 內部是緊湊型

  • YV12格式 字節排列 YYYY YYYY VV UU,平面型,V 在 U 前面

更多YUV格式參看:V4L2文檔翻譯(十)

4 :2: 2 和4:2:0 轉換

最簡單的方式:

YUV4:2:2 ---> YUV4:2:0 Y不變,將U和V信號值在行(垂直方向)在進行一次隔行抽樣

YUV4:2:0 ---> YUV4:2:2 Y不變,將U和V信號值的每一行分別拷貝一份形成連續兩行數據

YUV_420_888

YUV_420_888是在Android Camera2直播開發中遇到的一個Android內部的YUV格式,當時也是在這個格式上面糾結好久,直播的視頻流想用YUV420P格式的數據,但卻不清楚這個YUV_420_888到底對應的是NV21或者YUV420P還是其他,網上對這個格式的講解也比較少。在搜索一番之後終於搞定,在這裏記錄一下。

Android: Image類淺析(結合YUV_420_888)

從上面這篇文章可以瞭解到,YUV_420_888表示YUV420格式的集合,888表示Y、U、V分量中每個顏色佔8bit,在傳入參數的時候它是沒有指具體的格式的,其對應的具體的格式是根據獲得的數據纔去確認的。pixelStride代表行內顏色值間隔, 可以根據採集到的數據中的pixelStride值判斷具體的格式,再去做數據轉換。

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