
在上一篇文章中,我們帶大家了解了視頻、影像、像素和色彩之間的關系,還初步認識了兩種常用的色彩空間,分別是大家比較熟悉的 RGB,以及更受視頻領域青睞的 YUV,今天,我們將繼續深入學習 RGB、YUV 的相關內容,進一步了解它們的常見采樣格式和存盤格式,
色彩的采樣格式和存盤格式影響我們處理影像的方式,只有使用正確的方式,才能呈現正確的影像效果,
RGB 的采樣和存盤
我們已經知道,影像由像素組成,而像素通過記錄色彩空間各分量呈現各種各樣的色彩,對于 RGB 色彩空間,其三個分量 R(紅)、G(綠)、B(藍),它們之間具有相關性,對于色彩的表示來說缺一不可,
所以,RGB 的每個像素都會完整采樣三個分量,采樣比例為 1:1:1(指每個分量的采樣數,而非每個分量的數值),也正是因為這種采樣要求,RGB 顏色空間在采集上不好進行資料壓縮,不太適用于視頻影像的編碼、傳輸,
RGB 三個分量采樣后,在記憶體中是依次排列存盤的,但是,它們的存盤順序不一定是字面描述的 R、G、B,不同的應用場景,因處理邏輯差異可能會使用不同的規則,比如,MATLAB 使用的存盤順序為 R、G、B,而 OpenCV 則使用 B、G、R,如下圖所示:

R、G、B 順序

B、G、R 順序
我們把 RGB 字面描述的分量順序,稱為字面序,將其實際存盤的分量順序,稱為位元組序,確定好色彩空間存盤的位元組序,是正確處理影像的前提,如果隨意對各分量進行讀取,可能會導致處理后的顏色出現例外,下圖,即為使用 RGB 順序讀取位元組序為 BGR 的圖片的效果,此時,由于將 B、R 分量混淆了,得到了錯誤的圖片顏色,

左一:原圖,存盤格式為 BGR;左二:使用 RGB 格式進行讀取
另外,大家還也會接觸到 BGRA 這樣的存盤格式(比如在 iOS、MAC 上處理攝像頭資料),其中的 A ,表示在 RGB 三個通道基礎上,增加了一個透明度通道 Alpha,用于調整色彩的透明度,實作更豐富的色彩效果,對于增加了透明度的RGB,同樣需要留意其實際的存盤順序,常見的有 BGRA、RGBA、ABGR 和 ARGB 等等,
總之,RGB 的采樣格式、存盤格式相對比較簡單,我們也不做過多的展開,正如上篇文章所述,在視頻處理領域,YUV 色彩空間才是主角,它的采樣格式、存盤格式相對于 RGB 也更加復雜 ,
YUV的采樣和存盤
1、YUV 的采樣格式
大家已經知道,區別于 RGB 色彩空間,YUV 色彩空間的三個分量并非都參與顏色的表示,即便僅存在亮度分量 Y,也能呈現黑白灰的影像輪廓,而人眼對于色度分量 U、V 不是特別敏感,減少一些也不會太影響觀感,這種特性體現到采樣上,意味著允許我們少采集 U、V 分量、甚至于不采集 U、V 分量(黑白影像),從而在采集上實作可觀的資料壓縮,按 U、V 分量的采集方式不同,主流的 YUV 采樣格式有:YUV 4:4:4,YUV 4:2:2 和 YUV 4:2:0 幾種,
看到 “ YUV A:B:C ” 這種標識格式,大家是否很容易將其理解為 “ Y:U:V = A:B:C ”?這種理解是符合直覺的,但并不正確,實際上, "A:B:C" 格式并不是將 YUV 拆分為 3 個分量、然后按 A:B:C 的比例采集,而是基于一個 “寬度為 A 個像素、高度為 2 個像素” 的采樣區域,將 UV 分量作為一個整體進行采樣,然后描述 UV 分量組相對于 Y 分量的采樣率,

寬 A 個像素、高 2 個像素的區域
上面的解釋可能比較籠統,要理解 YUV A:B:C 的采樣邏輯,我們可以將其先進行拆解,整理為清晰可參考的 “規則”,再結合 “規則” 和實際案例進行分析,對于采樣格式 YUV A:B:C 相關 “規則” 的一種理解如下:
-
對于一個寬度為 A 個像素、高度為 2 個像素的采樣區域(兩行四列)
-
第一行需要采樣 A 個亮度分量 Y,B 個色度分量組 UV
-
第二行需要采樣 A 個亮度分量 Y,C 個色度分量組 UV
-
如果 C 為0,則表示第二行不再重新采樣 UV 分量,而是復用第一行的 UV 采樣
接下來,我們針對主流的 YUV 采樣格式,依據上述規則作具體決議,來幫助大家理解,
首先,我們來看看 YUV 4:4:4 采樣格式,參照上述“規則”,決議如下:
-
對于一個寬度為 4 個像素、高度為 2 個像素的采樣區域
-
第一行需要采樣 4 個亮度分量 Y,4 組色度分量 UV
-
第二行需要采樣 4 個亮度分量 Y,4 組色度分量 UV
除了文字決議外,我們還可以結合圖例來觀察,如果用空心圓圈表示 Y 分量,實心圓(藍色)表示 UV 分量,則 YUV 4:4:4 采樣邏輯可以表示為下圖(圖例顏色不代表實際采樣顏色):

YUV 4:4:4
參考上面的圖文說明,我們發現,在 YUV 4:4:4 采樣格式下 ,每采樣一個 Y 分量、就要相應地采樣一組 UV 分量,顯然,此時 UV 分量組相對于 Y 分量在寬度方向(水平)、高度方向(豎直)上均為等采樣,不存在降采樣的情況,也即 Y:UV = 1:1,這意味著,在 YUV 4:4:4 采樣下,每個元素都包含獨立、完整的亮度分量和色度分量,
YUV 4:4:4 采樣相對還比較簡單,大家肯定都能理解,我們再來看看 YUV 4:2:2,
參照“規則”,我們將 YUV 4:2:2 采樣決議如下:
-
對于一個寬度為 4 個像素、高度為 2 個像素的采樣區域
-
第一行需要采樣 4 個亮度分量 Y,2 組色度分量 UV
-
第二行需要采樣 4 個亮度分量 Y,2 組色度分量 UV
其對應的圖例如下:

YUV 4:2:2
參考圖例,YUV 4:2:2 采樣中,UV 分量組相對于 Y 分量在寬度方向有降采樣,水平每兩個 Y 分量將共用一個 UV 分量組,也即 Y : UV = 2 : 1,高度方向上未進行降采樣,第二行使用與第一行相同的采樣邏輯,重新采樣兩組獨立的 UV 分量,顯然,由于寬度方向有降采樣,YUV 4:2:2 對 UV 分量的采樣比 YUV 4:4:4 更少,但基于 YUV 的特性,雖然少采樣了部分 UV 分量,也不會太影響畫面的色彩,這就在色彩保真的前提下,實作了采集資料的壓縮,
以上,我們利用 “規則”,對 YUV 4:4:4 和 YUV 4:2:2 兩種采樣格式進行了決議,參考決議的結論,你可能會有一個疑問:目前討論的兩種采樣格式,似乎并沒有推翻 Y:U:V = A:B:C 的 “猜測” ?我們是否誤解了它?
當然不是,我們還一個采樣格式沒有決議,那就是 YUV 4:2:0,
如果按 Y:U:V = A:B:C 的邏輯,YUV 4:2:0 即表示 “ 僅對 Y、U 分量按 4:2 的比例采樣,不采集 V 分量 ”,這是一個錯誤的結論,YUV 4:2:0 采樣中仍然包含 YUV 三種分量,UV 分量并未脫離彼此,究竟該怎么理解 YUV 4:2:0 ,問題越是蹊蹺,我們越是要冷靜,不妨繼續參照“規則”,對 YUV 4:2:0 進行拆解:
-
對于一個寬度為 4 個像素、高度為 2 個像素的采樣區域
-
第一行需要采樣 4 個亮度分量 Y,2 組色度分量 UV
-
第二行需要采樣 4 個亮度分量 Y,0 組色度分量 UV
-
第二行需要復用第一行采樣的色度分量組 UV
先從文字說明上理解,YUV 4:2:0 的采樣邏輯相對于 YUV 4:2:2 的不同在于,它不僅在寬度方向上做了降采樣,在高度方向上也做了“手腳”,采樣區域的第二行,將不再采集獨立的 UV 分量組,而是復用第一行的采樣結果,
現在,我們再來看看圖例:

YUV 4:2:0
從圖例上看,YUV 4:2:0 在寬度方向、高度方向綜合起來,每 4 個 Y 分量(2 X 2 的采樣區域)將共用一個 UV 分量,
現在,你肯定對 YUV 4:2:0 采樣有了更清晰的認識,也明白了為什么 “ Y:U:V = A:B:C ” 是一個錯誤的“猜測”,同時,參考對 YUV 4:2:2 的分析,我們還可以推斷,由于 YUV 4:2:0 進一步降低了對 UV 分量的采樣,其采樣資料量相對于 YUV 4:2:2 更少,資料得到進一步壓縮,
除了以上三種主流的采樣格式,YUV 采樣格式還有諸如 YUV 4:1:1 等形式,我們就不做展開了,大家只要理解了 “A:B:C” 的規則邏輯,就能舉一反三、融匯貫通,雖然 YUV 采樣格式眾多,但其模型的共性可總結為:每個像素都會采樣亮度分量 Y,但N個像素可能會共用一組色度分量 UV,后者的差異也帶來了采樣資料量的差異,
關于 YUV 的采樣格式我們就先了解到這里,確定采樣格式對于正確處理 YUV 影像是至關重要的,如果采樣格式判定錯誤,會讀取到例外的影像,
如下,為基于 YUV444 采樣格式讀取 YUV420 格式圖片的一種例外效果:

左一:原圖,YUV420;左二:基于 YUV444 讀取YUV420
了解采樣格式后,就需要考慮如何進行存盤,YUV 的存盤格式也有好幾類,并且一種采樣格式還可以選擇不同的存盤格式,不同采樣格式搭配不同的存盤格式,得到了不同的 YUV 型別,這些知識綜合起來還是有一定理解和記憶難度的,大家跟著我的思路繼續往下學習,
2、YUV的存盤格式
在闡述 RGB 色彩空間的存盤格式時,我們重點關注了各個分量存盤時的 “排列方式”,依據排列的順序不同得到了 RGB 和 BGR 兩種存盤格式,在學習 YUV 的存盤時,我們也可以借鑒這個思路,
比較特殊的是,我們現在要引入陣列,來表示 YUV 的一種存盤結構**:平面(Plane),我們使用一個陣串列示一個存盤 “平面” ,N個不同的陣列即為 N 個平面,基于平面的概念,再按 YUV 存盤時的各分量的排列順序不同、使用的平面數量不同,我們可以將 YUV 存盤格式分為三大類:打包模式(Packed)、平面模式(Planar)和 半平面模式(Semi-Planar),**
我們先了解下各個模式的規則概述:
-
打包模式(Packed):使用一個平面進行存盤,在平面1上,將每個像素的 Y、U、V 分量打包后連續、交錯存盤;
-
平面模式(Planar):使用三個平面進行存盤,在平面1上,先連續存盤所有像素點的 Y 分量;然后在平面2上,存盤所有像素點的 U 分量;最后在平面3上,存盤所有像素點的 V 分量( U 和 V 的順序可以交換);
-
半平面模式(Semi-Planar):使用兩個平面進行存盤,在平面1上,先連續存盤所有像素點的 Y 分量;然后在平面2上,連續、交錯存盤所有像素點的 U、V分量( U 和 V 的順序可以交換),
以上規則的描述,還是比較清晰的,我們下面結合具體的采樣格式,看看不同采樣格式、在不同存盤格式下的具體表現,為便于理解,我們仍然基于 “寬度為 4 個像素、高度為 2 個像素” 的采樣區域作講述,
2.1 YUV 4:4:4 的存盤格式
YUV 4:4:4 采樣格式比較簡單,相應的,其對應的存盤格式也比較好理解,YUV 4:4:4 使用打包模式(Packed)進行存盤時,4x2 像素采樣區域的存盤圖示如下:

打包模式僅使用一個平面即可,我們可以將這個存盤平面視為一個 12x2 的陣列,
YUV 4:4:4 如果使用平面模式(Planar)進行存盤,如下圖:

可以看到,從打包模式變為平面模式,存盤平面增加了兩個,YUV 各分量分別存盤在不同的平面,每個平面均為一個 4x2 的陣列,在 YUV 4:4:4 采樣、平面模式存盤下,如果按先 Y、再 U 、最后 V 的順序存盤,我們稱這種 YUV 型別為 I444,如果調整存盤順序為先 Y、再 V 、最后 U,得到 YUV 型別為 YV24 ,
最后,我們再來看看 YUV 4:4:4 使用半平面模式(Semi-Planar)存盤的效果:

半平面模式下,存盤平面為兩個,分別存盤 Y 分量和 UV 分量,其中存盤 Y 分量的平面為 4 x 2 的陣列,存盤 UV 分量的平面為 8 x 2 的陣列,YUV 4:4:4 采樣、半平面模式存盤下,如果第二個平面按 U、V 的順序存盤,對應的 YUV 型別為 NV24,若使用 V、U 的順序存盤,則為 NV42,
以上,即為 YUV 4:4:4 采樣在不同存盤格式的表現,以及各種采樣格式、存盤格式搭配得到的不同 YUV 型別,接下來,按照相同的思路,我們看看 YUV 4:2:2、YUV 4:2:0 的表現,
2.2 YUV 4:2:2 的存盤格式
YUV 4:2:2 下各個分量的采樣邏輯已經討論過,結合上文,可簡要概括為 “ Y分量全采集,寬度方向每兩個 Y 分量共用一組 UV 分量,高度方向每行獨立采集 UV 分量 ”,如果你對此不是很理解,可以回到 2.1 節再復習一下,
YUV 4:2:2 使用打包模式(Packed)存盤,效果如下圖(淺藍色填充的每組 UV 分量,屬于左右兩個 Y 分量共用的采樣):

YUV 4:2:2 打包模式存盤下,唯一平面為 8x2 的陣列,每個 Packed 內部的順序為 Y U V Y,并且遵循兩個 Y 共用一組 UV 的特征,其得到的 YUV 格式為 YUVY(和 Packed 內順序一致),類似的,按照 Packed 內各分量順序不同,還可以得到 YUV 型別 VYUY 和 UYVY,
YUV 4:2:2 使用平面模式(Planar)存盤,效果如下:

YUV 4:2:2 平面模式存盤下,三個平面分別為 4x2、2x2、2x2 的陣列,若后兩個平面先存 U 后存 V ,則得到 YUV 型別 I422,若先存 V 后存 U ,則得到 YUV 型別 YV16,
YUV 4:2:2 使用半平面模式(Semi-Planar)存盤,效果如下:

YUV 4:2:2 半平面模式存盤下,兩個平面均為 4x2 的陣列,第二個平面內,若按 U、V 順序交錯存盤,則得到 YUV 型別 NV16,若按 V、U 順序交錯存盤,則得到 YUV 型別 NV61,
2.3 YUV 4:2:0 的存盤格式
以上,YUV 4:4:4 和 YUV 4:2:2 的主要存盤格式已介紹完畢,最后我們再來看看最常用的采樣格式 YUV 4:2:0 的存盤,YUV 4:2:0 主要使用平面模式(Planar)和 半平面模式(Semi-Planar),
結合上文,YUV 4:2:0 采樣可簡要概括為 “ Y 分量全采集,寬度方向和高度方向每四個 Y 分量共用一組 UV 分量,即第二行復用第一行的 UV 采樣”,如果你對此不是很理解,可以再回到 2.1 復習一下,
YUV 4:2:0 使用平面模式(Planar)存盤:

YUV 4:2:0 平面模式存盤下,三個平面分別為 4x2、2x1、2x1 的陣列,若后兩個平面先存 U 后存 V ,則得到 YUV 型別 I420,若先存 V 后存 U ,則得到 YUV 型別 YV12,
YUV 4:2:0 使用半平面模式(Semi-Planar)存盤:

YUV 4:2:0 半平面模式存盤下,兩個平面分別為 4x2、4x1 的陣列,第二個平面若按 U、V 順序交錯存盤,則得到 YUV 型別 NV12,若按 V、U 順序交錯存盤,則得到 YUV 型別 NV21,
以上,即為 YUV 主流采樣格式在不同存盤模式下的表現,以及各種組合搭配得到的不同 YUV 型別,值得一提的是,在諸多 YUV 型別中,NV21 是 Android 系統相機使用的型別,而 NV12 被 iOS、MAC 系統相機使用(前面提到,iOS 和 MAC 也會使用 BGRA),大家今后會經常遇到它們,可以優先熟悉熟悉,
與 RGB 一樣,我們只有確認了 YUV 影像的存盤格式,才能對其進行正確地處理,使用錯誤的格式會導致顏色例外,
如下,原圖為使用平面模式存盤、先存 U 平面、再存 Y 平面的 YUV420 影像(I420),如果按 YV12 格式讀取(平面模式存盤、先存 V 平面、再存 U 平面)將得到圖2,

左一:原圖,I420;左二:基于 YV12 讀取 I420
為方便查閱,我們再將上面提及的,不同采樣格式、存盤模式、UV 存盤順序以及 YUV 型別的匹配關系,通過表格整理一下:

總結
不得不說,相較于 RGB,YUV 的采樣格式和存盤格式還是比較復雜的,組合得到的 YUV 型別也是眼花繚亂,你此時或許已云里霧里,這么多格式和型別,該如何去記憶呢?
答案是:無需死記硬背某種具體格式、型別的細節,當我們需要用到的時候,再查閱資料即可,我們需要重點掌握的,是對 “采樣格式”、“存盤格式” 概念規則的理解,在理解概念規則的基礎上,對于任何種 YUV 型別,我們都可以按 “確認采樣格式 → 確認存盤格式 → 確認 UV 存盤順序” 的思路進行分析,如前面所說,做到融會貫通方可舉一反三,
最后,我們通過一個思維導圖,梳理一下本篇文章的知識脈絡:


問
本期思考題
請參照 YUV 采樣格式的“規則”,說明 YUV 4:1:1 的采樣邏輯?
(??下期揭秘)
上期思考題 揭秘 ??
問:
RGB顏色空間也能表示黑白色和彩色,為什么還需要YUV來解決黑白電視和彩色電視之間的兼容互通問題呢?
答:
在黑白電視向彩色電視的過渡期,兩種型別的電視系統需要共存互通,RGB 色彩空間可以滿足彩色電視的顯示需求,也完全能勝任黑白畫面的顯示任務,但是如果統一使用RGB色彩空間,會存在如下問題:
1、RGB 即使只表示黑白,也需要存盤三個分量,只不過各分量的值均是0或1,而黑白電視作為舊系統,只能處理一個亮度分量,無法向前兼容RGB;
2、RGB 必須使用三個通道,會極大增加傳輸帶寬的壓力,
而 YUV 很好地解決了上述問題:
1、黑白電視可以僅接收 Y 信號、忽略 U、V 信號,向后兼容;
2、YUV 可以與 RGB 無損轉換,向前兼容;
3、YUV 可以對 UV 分量進行降采樣,降低資料量同時色彩保真,節省帶寬,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/517781.html
標籤:其他
上一篇:K8S 拉取阿里云鏡像
下一篇:一鍵上手時下最火AI作畫工具
