天天看點

視訊剪輯中的色彩空間

作者:閃念基因

1. 前言

檢視視訊檔案中對顔色的描述,使用ffprobe指令:ffprobe -i 視訊檔案位址 -show_streams,有列印如下顔色相關的資訊:

視訊剪輯中的色彩空間

以上參數表示:視訊的色彩模型使用YUV表示,采樣格式是420p;色彩範圍使用tv模式,又叫limited range;YUV到RGB的轉換矩陣采用BT.601(smpte170m);傳遞函數:BT.601(smpte170m);色彩原色:BT.601(bt470bg)。

在剪輯場景下,往往需要處理多個視訊檔案,而視訊檔案的顔色資訊又可能各不相同,如何正确使用這些參數,讓播放時視訊正确的顯示在螢幕上,導出的視訊不會産生偏色?帶着這些問題,我們先來了解一些色彩空間的概念:色域、傳遞函數、轉換矩陣、YUV/YCbCr模型。

2. 色彩空間

2.1. 馬蹄圖:

人們通過實驗發現,僅僅通過三種基本顔色就可以組合成其他顔色,這就是三原色理論,與人眼感覺顔色的三種視錐細胞L、M、S相對應。

顔色比對實驗:把螢幕分成兩半,左邊投影純色光。右邊使用三基色(RGB)混合,觀察者可以改變基本光的強度,直到分辨不出兩塊螢幕顔色有差別,并記錄三基色的強度。

1931年國際照明委員會CIE使用700nm的紅、546.1nm的綠、435.8nm的藍作為三原色,通過顔色比對實驗建立了CIE 1931 RGB色度系統,并從該系統中導出隻有rg兩軸的平面坐标圖CIE 1931 RGB色度圖,如圖1,在消滅 RGB色度圖中的負值和亮度後,得到CIE 1931 XY色度圖,又稱馬蹄圖,如圖2。

視訊剪輯中的色彩空間
視訊剪輯中的色彩空間

圖1:CIE 1931 RGB色度圖 圖2: CIE 1931 XY色度圖

2.2. 色域:color_primaries

色域由三原色和白點構成。

取R(1,0,0),G(0,1,0),B(0,0,1) 映射到CIE 1931 XY空間,構造一個三角形,這個三角形區域就是色域,三個頂點表示該色域下的紅綠藍三原色,不同色域的三原色在XY空間中的坐标不同,比如BT.709(sRGB)三原色坐标為:R(0.640, 0.330),G(0.300, 0.600),B(0.150, 0.060);BT.2020三原色坐标為:R(0.708, 0.292),G(0.170, 0.797),B(0.131, 0.046)。三角形的體積越大能表現的顔色越多,BT709(sRGB)占了所有顔色的35.9%、BT2020占了所有顔色的75.8%。

視訊剪輯中的色彩空間
視訊剪輯中的色彩空間

圖3:不同色域在馬蹄圖中的表示範圍

色域三角形中心的白點表示該色域下的基準白色,移動白點會導緻整個色域相對偏藍或者偏紅,BT601/BT709/BT2020的基準白色都是D65,坐标(x=0.3127, y=0.3290)。

色域轉換。二維色域圖是三角形,三維色域圖是一個立方體,圖4:是RGB空間在CIE XYZ空間中的三維映射,向量SR、SG、SB構成的立方體是色域的RGB顔色空間,色域不同就是位于XYZ坐标系下RGB立方體不同,那麼色域轉換需要先把rgb值轉到XYZ坐标系得到xyz值,再從xyz值轉到目标色域RGB坐标系下得到新的rgb值。

視訊剪輯中的色彩空間
視訊剪輯中的色彩空間

圖4: RGB顔色空間在CIE XYZ顔色空間中的三維映射

色域轉換流程:BT2020色域 => XYZ坐标 => BT709如下:

BT2020RGB轉XYZ矩陣:

視訊剪輯中的色彩空間

XYZ轉BT709RGB矩陣:

視訊剪輯中的色彩空間

相乘得到BT2020轉BT709矩陣:

視訊剪輯中的色彩空間

2.3. 傳遞函數:color_transfer

傳遞函數又稱gamma矯正,傳遞函數用來把線性的自然光信号轉換成非線性的電信号存儲,這個過程是gamma編碼,叫做光電轉換(OETF),顯示屏把非線性的電信号轉換成螢幕光顯示,這個過程是gamma解碼,叫做電光轉換(EOTF),視訊檔案中的color_transfer值顯示為BT.601(smpte170m)、BT.709等,BT601的gamma值是2.4,BT709的gamma值是2.2,下圖5是傳遞函數變換曲線,經過OETF和EOTF疊加之後,信号重新變成一條直線。

視訊剪輯中的色彩空間

圖5: gamma編碼/解碼曲線

為什麼需要gamma矯正,主要有以下3個原因:

1、人眼對亮度的感覺是非線性的,對暗部細節更加敏感,而對亮部細節相對不敏感。這意味着直接使用線性亮度值來表示圖像會導緻圖像在視覺上顯得不自然。gamma 矯正通過非線性變換來調整亮度,使其更符合人眼的感覺特性。圖6中自然界亮度變化是線性的,而人眼視覺上是對數的。

視訊剪輯中的色彩空間

圖6: 實體灰階與視覺灰階對比

2、顯示器特性

顯示裝置(如 CRT 顯示器、LCD 螢幕、投影儀等)在響應輸入電壓和輸出亮度之間也存在非線性關系。CRT 顯示器的亮度輸出與輸入電壓的關系大緻遵循一個幂函數,輸出亮度L與輸入信号V之間的關系可以表示為 L=,其中是 gamma 值,通常約為 2.2 到 2.5。為了在這些顯示裝置上正确顯示圖像,必須進行 gamma 矯正。

3、保留更多的暗部細節

對圖像進行 gamma 矯正可以提高編碼和存儲效率。在沒有 gamma 矯正的情況下,高亮度值會占據大量的編碼空間,而低亮度值的細節可能會丢失。通過 gamma 矯正,将亮度值進行非線性變換,可以更好地配置設定編碼空間,儲存更多的暗部細節資訊。

2.4. YUV轉換矩陣:color_space

color_space用來表示YUV與RGB之間轉換時,所使用的轉換矩陣系數,是一個3*3的矩陣。

YUV色彩模型

在講轉換矩陣之前,先來了解一下YUV的定義,其中Y表示亮度資訊,UV表示色度資訊。YUV的優勢:1、把亮度和色度分離,比較适合圖像處理領域。2、與RGB相比,YUV所使用的存儲空間更小。

YCbCr模型源于YUV模型,YUV應用于模拟電視系統,如 PAL 和 NTSC 标準,用于確定彩色電視信号與黑白電視信号的相容性。YCbCr 色彩模型主要用于數字視訊标準,如 JPEG 圖像壓縮、MPEG 視訊壓縮以及數字電視标準(如 ITU-R BT.601 和 BT.709),人們常說的YUV大多是指YCbCr,本文所說的YUV均表示YCbCr,YUV有許多采樣格式, 如4∶4∶4 , 4∶2∶2 , 4∶1∶1 和4∶2∶0。比較常用的是4∶2∶0格式,4個Y共用一對UV,YUV420又有四種格式i420、YV12、NV12、NV21,這幾種格式的差別主要在于UV存儲順序不同,下圖7所示:

視訊剪輯中的色彩空間

圖7: YUV420 4種格式的差異

轉換矩陣

視訊檔案中的color_space字段表示在YUV轉RGB時需要使用哪個轉換矩陣,比如BT601/BT709/BT2020等,以BT709為例:

視訊剪輯中的色彩空間

BT709YUV與RGB之間互相轉換的矩陣

YUV色彩範圍

YUV有兩種色彩範圍:tv range和pc range,tv range又叫limited range,pc range又叫full range,ffmpeg中用AVCOL_RANGE_MPEG和AVCOL_RANGE_JPEG分别表示tv range和pc range。下表展示了tv range與pc range的數值範圍對比:

視訊剪輯中的色彩空間

為什麼需要tv range

1、曆史原因:有限範圍的YUV是為了相容模拟電視信号設計的。在模拟信号中,值不能達到完全的黑色0或完全的白色255,是以采用了有限的範圍來確定信号的穩定性和相容性。

2、防止裁剪和超量化:使用有限範圍可以防止在信号傳輸和處理過程中因裁剪或超量化導緻的圖像損失。例如,Y分量的值在0-15和236-255之間被保留用于同步信号和錯誤檢測。在低段不使用的16個數字,學名叫footroom,高的那段叫headroom,這部分不能用的數字表示sync信号。

3、色彩空間轉換:在從RGB轉換到YUV色彩空間時,有限範圍可以防止極端的顔色值在轉換過程中導緻失真或剪切。

tv range YUV->RGB轉換矩陣

需要把原點從(16, 128, 128)移動回(0, 0, 0),然後再把YUV值縮放到pc range的範圍,公式如下:

視訊剪輯中的色彩空間

以BT709YUV為例。

BT709歸一化YUV轉換到RGB:

視訊剪輯中的色彩空間

BT709 8位YUV轉換到RGB:

視訊剪輯中的色彩空間

3. 剪輯中的處理

以BT709作為目标為例:輸入視訊統一轉到BT709色域。

視訊剪輯中的色彩空間
  • 首先根據color_space和color_range資訊得到yuv轉rgb的矩陣,得到rgb = YUV2RGB_BT470BG_TV_MAT * yuv。
  • 根據color_transfer得到傳遞函數,把非線性rgb轉為線性,gamma解碼:rgb = BT470BG_EOTF_gammaMethod(rgb)。
  • 色域轉換,先從BT601色域坐标系轉到XYZ坐标再轉到BT709坐标系,rgb = BT601_TO_BT709_MAT * rgb。
  • 把線性rgb資料送給渲染引擎,添加特效資訊,比如高斯模糊等。
  • 螢幕的輸入rgb要求非線性,在上屏顯示之前需要gamma編碼:rgb = BT709_OETF_gammaMethod(rgb)。
  • 視訊導出:把上屏前的非線性rgb與BT709 color_space/ tv color_range的逆矩陣相乘,得到yuv資料,同時配置視訊流的色彩範圍為:tv range,color_space:709,傳遞函數:BT.709,色彩原色:BT.709。

4. 總結

在視訊剪輯中,顔色處理是確定視訊品質和視覺效果的關鍵步驟。了解色域和色彩空間的概念,正确進行顔色校正和處理,可以顯著提升視訊的專業性和吸引力,對後續HDR的支援,HDR與SDR的互相轉換也非常重要。

作者:一禅

來源-微信公衆号:哔哩哔哩技術

出處:https://mp.weixin.qq.com/s/4n70cc9_R2KJh4GF2fexJg

繼續閱讀