1. 程式人生 > IOS開發 >筆記-YUV和RGB的那些事~

筆記-YUV和RGB的那些事~

在學習Metal繪製渲染的過程中,看到了顏色編碼轉換有關的YUV,之前知道YUV和RGB都是顏色變色編碼種類,但是一直不知道具體是啥以及有啥聯絡。所以花了點時間翻看資料並思考理解和整理了一下知識點。

RGB和YUV

​ 我們知道顏色都是有三原色(紅、綠、藍)組成的,也就是RGB,可以組成非常多的顏色,這些我們都知道的知識。在我們錄製視訊和播放視訊的時候採用的一般都是RGB編碼格式,在螢幕上每一個畫素點都含有R分量、G分量、B分量,由這些一個個的畫素上展示的顏色才構成了我們看見的圖片,視訊是一幀幀圖片組成的。 說完了RGB,寡下YUV,YUV和RGB一樣,也是每個畫素都含有Y、U、V三中分量。YUV和黑白電視有關,正是因為工程師想要在黑白裝置上呈現彩色而發明的編碼格式?,YUV是由Y(明亮度)、UV(色度)組成的,其實只要有Y值就能看見圖片、視訊,只不過是黑白的。

​ RGB編碼格式中每個分量佔一個位元組,即8bit,一個畫素佔用24bit空間,而YUV4:4:4編碼格式中也是一樣的(後面會說到YUV編碼格式)大小。

假如一張圖片大小為1024*1024,那麼他的大小為:

imageSize = 1024x1024x3x8/8/1024/1024 = 3.0MB

RGB和YUV的轉換

Y = 0.299R + 0.587G + 0.114B

U = -0.14713R - 0.28886G + 0.436B

V = 0.615G - 0.51499G - 0.10001B

R = 1.0Y + 1.13983V

G = 1.0Y - 0.39465U - 0.58060V

B = 1.0Y + 2.03211U

YUV編碼格式

主流取樣方式三種:YUV4:4:4、YUV4:2:2、YUV4:2:0。YUV編碼方式可以減少圖片的大小,減少頻寬和資源。

YUV 4:4:4取樣

圖中展示的有6個畫素,每個畫素有YUV分量組成。從圖片我們知道YUV4:4:4取樣方式每個分量都取樣,所以同等寬高的圖片的大小和RGB的大小是一致的。通過這個取樣方式圖片大小並沒有減少,但是在編碼轉換的時候,影象從RGB轉YUV,首先轉成該取樣方式的影象,然後再通過其他取樣方式進行轉換。

YUV 4:2:2取樣

從這張圖片我們知道該取樣的特點就是UV分量分別隔一個畫素進行取樣,即兩個畫素共用一個UV分量,Y和UV分量按2:1的比例取樣

。採用這種編碼方式,圖片大小是原圖大小的66.7%,這就是為啥會廣泛採用YUV編碼方式來進行傳輸,可以減少頻寬、節約資源。

YUV 4:2:0取樣

從上面我們知道YUV4:2:2方式圖片大小就減少了1/3,但是常用的是YUV 4:2:0取樣方式。

從上圖可知,我們知道圖片比在RGB空間的大小減少了50%,是不是很誇張!但這就是他的神奇之處。圖中有兩行畫素,每行畫素有6個畫素。該取樣方式的特點就是4個畫素共用一套UV分量,每個畫素均取Y分量,一行畫素取U分量,鄰行畫素取V分量,並且UV分量畫素取一次。例如圖中的第0、1、7、8畫素共用了U0和V8。正是由於該取樣方式可以直接減少一半的圖片大小,該方式很常用。

YUV儲存格式

YUV取樣儲存資料有兩種方式:

  • planr: 平面格式,先連續儲存畫素點的Y分量,其次儲存U分量,最後儲存V分量。
  • packed: 打包模式,每個畫素點的Y分量、U分量、V分量連續交替儲存的。

正式由於取樣的方式不同和儲存格式的不同所以有多種YUV格式,這些格式主要基於YUV 4:2:2取樣和YUV4:2:0取樣。

YUV儲存格式 基於YUV 4:2:2取樣格式 基於YUV 4:2:0取樣格式
planr YUV420P、YUV420SP
packed YUYV、UYVY、YUV422P(I422)
packed方式

上表中的打包樣式YUYV、UYVY都是根據每個畫素均取Y分量,隔畫素取U、V分量。所以他的儲存排序如下:

YUYV:

Y0U0 Y1V0 Y2U2 Y3V2 Y4U4 Y5V4 Y6U6

UYVY:

U0Y0 V0Y1 U2Y2 V2Y3 U4Y4 V4Y5 U6Y6

YUV422P格式和上面差不多,都是類似的組合方式。

planr方式
基於YUV 4:2:0樣式 格式
YUV420P YU12、YV12
YUV420SP NV12、NV21

YU12和YV12是YUV420P型別,先儲存Y分量,然後在儲存UV分量,不同的是YU12是先Y再U後V,YV12是先Y再V後U儲存。

Y0 Y1 Y2 Y3 Y4 ...

Uo U1 ...

V0 V1 ...

YUV420SP有NV12和NV21兩種格式。與YUV 420P不同的是先儲存Y分量,然後UV分量交替儲存。其中NV12是iOS中有的模式,就是先儲存Y分量,UV分量交替儲存時先U後V;而NV21時Android Q中有的模式,就是先儲存Y分量,UV分量交替儲存時先V後U。

總結

通過了解YUV、RGB編碼兩者的關係,以及YUV編碼格式帶來的收益可以讓我們在開發中有一定的幫助,以及YUV儲存方式可以開拓一下知識點。

參考:

1.YUV-維基百科

2.YUV取樣與格式