YUV 是一種顏色編碼方法,和它等同的還有 RGB 顏色編碼方法。php
RGB 三個字母分別表明了 紅(Red)、綠(Green)、藍(Blue),這三種顏色稱爲 三原色,將它們以不一樣的比例相加,能夠產生多種多樣的顏色。html
在圖像顯示中,一張 1280 * 720 大小的圖片,就表明着它有 1280 * 720 個像素點。其中每個像素點的顏色顯示都採用 RGB 編碼方法,將 RGB 分別取不一樣的值,就會展現不一樣的顏色。bash
RGB 圖像中,每一個像素點都有紅、綠、藍三個原色,其中每種原色都佔用 8 bit,也就是一個字節,那麼一個像素點也就佔用 24 bit,也就是三個字節。微信
一張 1280 * 720 大小的圖片,就佔用 1280 * 720 * 3 / 1024 / 1024 = 2.63 MB 存儲空間。編碼
YUV 顏色編碼採用的是 明亮度 和 色度 來指定像素的顏色。spa
其中,Y 表示明亮度(Luminance、Luma),而 U 和 V 表示色度(Chrominance、Chroma)。.net
而色度又定義了顏色的兩個方面:色調和飽和度。3d
使用 YUV 顏色編碼表示一幅圖像,它應該下面這樣的:code
和 RGB 表示圖像相似,每一個像素點都包含 Y、U、V 份量。可是它的 Y 和 UV 份量是能夠分離的,若是沒有 UV 份量同樣能夠顯示完整的圖像,只不過是黑白的。orm
對於 YUV 圖像來講,並非每一個像素點都須要包含了 Y、U、V 三個份量,根據不一樣的採樣格式,能夠每一個 Y 份量都對應本身的 UV 份量,也能夠幾個 Y 份量共用 UV 份量。
對於圖像顯示器來講,它是經過 RGB 模型來顯示圖像的,而在傳輸圖像數據時又是使用 YUV 模型,這是由於 YUV 模型能夠節省帶寬。所以就須要採集圖像時將 RGB 模型轉換到 YUV 模型,顯示時再將 YUV 模型轉換爲 RGB 模型。
RGB 到 YUV 的轉換,就是將圖像全部像素點的 R、G、B 份量轉換到 Y、U、V 份量。
有以下公式進行轉換:
此時的轉換結束後,每一個像素點都有完整的 Y、U、V 份量。而以前提到 Y 和 UV 份量是能夠分離的,接下來經過不一樣的採樣方式,能夠將圖像的 Y、U、V 份量從新組合。
接下來的不一樣採樣格式都是在一張圖像全部像素的 RGB 轉換到 YUV 基礎上進行的。
YUV 圖像的主流採樣方式有以下三種:
YUV 4:4:4 採樣,意味着 Y、U、V 三個份量的採樣比例相同,所以在生成的圖像裏,每一個像素的三個份量信息完整,都是 8 bit,也就是一個字節。
以下圖所示:
其中,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 份量。
以下圖所示:
其中,Y 份量用叉表示,UV 份量用圓圈表示。
舉個例子 :
假如圖像像素爲:[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 份量,第三和第四個像素點公用了 U二、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 。
以下圖所示:
其中,Y 份量用叉表示,UV 份量用圓圈表示。
假設第一行掃描了 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 V6]、[Y7 U2 V7]、[Y8 U2 V8]
複製代碼
從映射出的像素點中能夠看到,四個 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 格式。這些格式主要是基於 YUV 4:2:2 和 YUV 4:2:0 採樣。
常見的基於 YUV 4:2:2 採樣的格式以下表:
YUV 4:2:2 採樣 |
---|
YUYV 格式 |
UYVY 格式 |
YUV 422P 格式 |
常見的基於 YUV 4:2:0 採樣的格式以下表:
YUV 4:2:0 採樣 | YUV 4:2:0 採樣 | |
---|---|---|
YUV 420P 類型 | YV12 格式 | YU12 格式 |
YUV 420SP 類型 | NV12 格式 | NV21 格式 |
更多的 YUV 格式信息參考這裏:YUV pixel formats
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 份量....
UYVY 格式也是採用打包格式進行存儲,它的順序和 YUYV 相反,先採用 U 份量再採樣 Y 份量,排列順序以下:
U0 Y0 V0 Y1 U2 Y2 V2 Y3
Y0 和 Y1 公用 U0 V0 份量,Y2 和 Y3 公用 U2 V2 份量....
根據 UV 和 Y 的順序還有其餘格式,好比,YVYU 格式,VYUY 格式等等,原理大體同樣了。
YUV 422P 格式,又叫作 I422,採用的是平面格式進行存儲,先存儲全部的 Y 份量,再存儲全部的 U 份量,再存儲全部的 V 份量。
基於 YUV 4:2:0 採樣的格式主要有 YUV 420P 和 YUV 420SP 兩種類型,每一個類型又對應其餘具體格式。
YUV 420P 和 YUV 420SP 都是基於 Planar 平面模式 進行存儲的,先存儲全部的 Y 份量後, YUV420P 類型就會先存儲全部的 U 份量或者 V 份量,而 YUV420SP 則是按照 UV 或者 VU 的交替順序進行存儲了,具體查看看下圖:
YUV420SP 的格式:
YUV420P 的格式:
YU12 和 YV12 格式都屬於 YUV 420P 類型,即先存儲 Y 份量,再存儲 U、V 份量,區別在於:YU12 是先 Y 再 U 後 V,而 YV12 是先 Y 再 V 後 U 。
YV 12 的存儲格式以下圖所示:
YU 12 又稱做 I420 格式,它的存儲格式就是把 V 和 U 反過來了。
NV12 和 NV21 格式都屬於 YUV420SP 類型。它也是先存儲了 Y 份量,但接下來並非再存儲全部的 U 或者 V 份量,而是把 UV 份量交替連續存儲。
NV12 是 IOS 中有的模式,它的存儲順序是先存 Y 份量,再 UV 進行交替存儲。
NV21 是 安卓 中有的模式,它的存儲順序是先存 Y 份量,在 VU 交替存儲。
以上就是關於 YUV 的知識總結,你有看明白了嘛?
歡迎關注微信公衆號:【紙上淺談】,得到最新文章推送~~~