本文由百度技術王偉分享,原題“視頻中為什么需要這么多的顏色空間?”,本文收錄時有修訂和改動。
1、引言
在視頻處理中,我們經常會用到不同的色彩空間:非線性RGB,線性 RGB,YUV,XYZ……為什么需要這么多的色彩空間呢?為什么在 FFMpeg 中會有 color_space,color_transfer,color_primaries 等一系列的顏色屬性呢?這些術語之間究竟隱藏著什么秘密?
本文將以通俗易懂的文字,引導你理解視頻是如何從采集開始,歷經各種步驟,最終通過顏色模型轉換和不同的色域轉換,讓你看到賞心悅目的視頻結果的。
2、系列文章
本文是系列文章中的第20篇,本系列文章的大綱如下:
《即時通訊音視頻開發(一):視頻編解碼之理論概述》
《即時通訊音視頻開發(二):視頻編解碼之數字視頻介紹》
《即時通訊音視頻開發(三):視頻編解碼之編碼基礎》
《即時通訊音視頻開發(四):視頻編解碼之預測技術介紹》
《即時通訊音視頻開發(五):認識主流視頻編碼技術H.264》
《即時通訊音視頻開發(六):如何開始音頻編解碼技術的學習》
《即時通訊音視頻開發(七):音頻基礎及編碼原理入門》
《即時通訊音視頻開發(八):常見的實時語音通訊編碼標準》
《即時通訊音視頻開發(九):實時語音通訊的回音及回音消除概述》
《即時通訊音視頻開發(十):實時語音通訊的回音消除技術詳解》
《即時通訊音視頻開發(十一):實時語音通訊丟包補償技術詳解》
《即時通訊音視頻開發(十二):多人實時音視頻聊天架構探討》
《即時通訊音視頻開發(十三):實時視頻編碼H.264的特點與優勢》
《即時通訊音視頻開發(十四):實時音視頻數據傳輸協議介紹》
《即時通訊音視頻開發(十五):聊聊P2P與實時音視頻的應用情況》
《即時通訊音視頻開發(十六):移動端實時音視頻開發的幾個建議》
《即時通訊音視頻開發(十七):視頻編碼H.264、V8的前世今生》
《即時通訊音視頻開發(十八):詳解音頻編解碼的原理、演進和應用選型》
《即時通訊音視頻開發(十九):零基礎,史上最通俗視頻編碼技術入門》
《即時通訊音視頻開發(二十):一文讀懂視頻的顏色模型轉換和色域轉換》(* 本文)
3、視頻采集
如上圖所示,在相機系統中,外部世界的光信息(光子,photons)通過透鏡或其他光學器件聚焦之后達到相機的圖像傳感器(CCD 或者 CMOS)。
過程是這樣的:
- 1)圖像傳感器可以將一個入射光子(photon)轉換為對應的一個電子(electron);
- 2)在曝光時間內,圖像傳感器對轉換的電子進行電荷積累;
- 3)然后,圖像傳感器會將積累的電荷信號轉換成對應的電壓信號;
- 4)最后,利用 ADC 把電信號轉換成數字信號,而轉換后的數字信號則為某個范圍內的整數值。
ADC 數字信號的取值范圍 :
[pquote]ADC 轉換之后的數字信號的取值范圍受限于 ADC 設備。對于 8-bits 的 ADC 而言,數字信號的取值范圍為 [0, 2^8-1],因此,對于每一個像素而言,會用 [0, 255] 之間的整數來進行編碼。[/pquote]
ADC 轉換的數字信號的數值是一個線性編碼的過程,這意味著如果將圖像傳感器上的光量增加 1 倍,則 ADC 轉換之后對應的數值也會增加 1 倍。
這是一個非常有用的特性:無論是增加物理世界的光量,還是增加 ADC 轉換之后的數值,對圖片而言,都會帶來相同的效果。線性編碼意味著我們所處理的數據和光發射的強度成正比關系。
由數碼相機中的 CMOS 傳感器產生并寫入原始文件(Raw File)的數據是線性的。與普通照片相比,線性數據通常看起來非常暗且對比度較低。
在 iPhone 手機中,可以通過設置相機來拍攝 Apple ProRAW 格式的照片。
4、探索視頻伽馬校正
研究表明:人類視覺系統是以對數函數的方式來感知光亮度。這意味著:人眼會提高暗部的敏感度,降低高光部分的敏感度。
從數學角度看,感知光強度和測量光強度之間存在一個*似的*方關系,具體如下式所示。
由于人類視覺感知系統不是以線性方式工作的,因此必須使用非線性曲線來對 ADC 生成的的線性數據進行變換,從而使得拍攝的圖像色調與我們的視覺系統的工作方式相匹配。這個過程也就是我們所說的 伽馬校正。
因此:在從線性 RGB 空間轉換到非線性 RGB 空間時,需要 γ 作為轉換參數。相機中的 ISP 模塊負責對圖像傳感器的線性 RGB 進行伽馬校正進而產生對應的符合人眼感知的非線性 RGB 數據。
RGB 的設備依賴性 :
不同顯示設備支持的色域空間不同,因此對于不同的顯示設備而言,伽馬校正之后的 RGB 數值也不同。從這個角度講,RGB 是設備依賴型的色彩空間。
5、視頻壓縮
根據如上的信息,我們知道:相機系統經過 ISP 處理之后,最終會得到非線性的 RGB 信息。對于視頻而言,如果以 RGB 存儲每幀的信息,則需要消耗大量的存儲空間。
人類視覺系統對顏色信息的敏感度要弱于亮度信息。利用這一特點,通常相機會將捕獲的 RGB 信息轉換為 YUV 格式,然后對 YUV 格式進行色度信息采樣(例如,YUV420)以便壓縮圖像空間。
RGB->YUV,不同標準有不同要求,一般常用的標準有:
- 1)BT. 601(SD: Standard-Definition);
- 2)BT. 709(HD: High-Definition);
- 3)BT. 2020(UHD: Ultra-High-Definition)。
注意 :
標準中,不但會規定 RGB->YUV 的轉換系數,同時還會規定從線性 RGB 到非線性 RGB 轉換的 gamma 系數。
將 RGB顏色模型,轉換成 YUV 模型后,接下來會采用某種視頻編解碼算法(例如,H265, VP9)對獲取的數據進行視頻編碼,最終得到視頻文件(此處忽略了音頻的采集編碼以及合流的操作)。
6、視頻轉碼
出于各種原因,例如:
- 1)終端用戶的帶寬受限;
- 2)終端用戶支持的視頻編解碼算法和相機壓縮視頻的編解碼算法不一致;
- 3)……
一般不會直接把相機產出的視頻文件分發給用戶去消費。媒體服務商會對相機生成的視頻文件進行轉碼,然后選擇合適的轉碼后的視頻分發給終端消費用戶。
在視頻轉碼階段,如果我們希望對原視頻進行色域的變換,例如從 BT. 601 轉碼為 BT. 709,則需要在不同色域的 RGB 數值之間進行轉換。
在不同的色域空間進行 RGB 數據的轉換,這也就是我們所說的 色彩管理。色彩管理會對圖像進行色彩管理以適配當前環境下的顏色效果,從而保證同一張圖片在不同輸入、輸出上都呈現出最好的顏色。
色彩轉換需要在某個線性空間下進行操作,并且操作過程需要保持設備的獨立性。因此,不同的 RGB 色域空間是不能直接進行轉換的,需要一個設備無關、線性的顏色模型作為中轉才能實現其轉換。
而 XYZ(CIE 1931 XYZ color space)具備設備無關、線性操作的特性。
在 FFMpeg 中,主要使用 colorspace 濾鏡 來完成不同色域空間的轉換。
根據 colorspace 的實現可知,在 FFMpeg 中,BT. 601->BT. 709 的轉換過程如下所示:
在如上的變換中,涉及到 3 個顏色空間的轉換,分別是:
- 1)YUV 和 RGB 之間的轉換;
- 2)線性 RGB 和非線性 RGB 之間的轉換;
- 3)線性 RGB 和 XYZ 之間的轉換。
在 FFMpeg 中,所有的這些轉換參數都保存在 AVFrame 結構中:
- 1)AVFrame->colorspace 中保存了 YUV/RGB 的轉換矩陣;
- 2)AVFrame->color_trc 中保存了線性 RGB 和非線性 RGB 之間的轉換函數(transformation characteristics);
- 3)AVFrame->color_primaries 中保存了 RGB/XYZ 的轉換矩陣;
如果用 ffprobe 命令解析視頻文件,則:
- 1)color_space 字段對應 YUV/RGB 的轉換矩陣;
- 2)color_transfer 字段對應線性 RGB 和非線性 RGB 之間的轉換函數;
- 3)color_primaries 字段對應 RGB/XYZ 的轉換矩陣。
$ ffprobe -select_streams v:0 -show_entries stream=color_space,color_transfer,color_primaries test.mp4
[STREAM]
color_space=bt2020nc
color_transfer=arib-std-b67
color_primaries=bt2020
[/STREAM]
在如上的例子中,arib-std-b67 也就是我們所熟悉的 HLG。
在 MediaInfo 中:
- 1)Matrix coefficients 字段對應 YUV/RGB 的轉換矩陣;
- 2)Transfer characteristic 字段對應線性 RGB 和非線性 RGB 之間的轉換函數;
- 3)Color primaries 字段對應 RGB/XYZ 的轉換矩陣。
除了如上的參數外,AVFrame->range 還用來存儲視頻中對應像素的每個分量的取值范圍。
在 vf_setparams.c 中也作了相關的定義說明:
{"limited", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, "range"},
{"tv", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, "range"},
{"mpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, "range"},
{"full", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, "range"},
{"pc", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, "range"},
{"jpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, "range"},
7、視頻解碼&播放
7.1基本
轉碼之后的視頻,可以通過各種渠道分發到終端用戶進行消費。
對于大部分顯示設備,例如CRT顯示器、LCD、OLED,屏幕上的每個像素都是通過驅動三個非常靠*但仍然分開的小型 RGB 光源而構建的。
因此:顯示屏(監視器、電視機、屏幕等等)僅使用 RGB 模型,并以不同的方式來組織,并顯示最終的圖像。
如前所述:不同的顯示設備采用的 RGB 的色域并不一定相同,因此,RGB 是一種設備依賴型的顏色模型。在 Mac 電腦上,可以通過顯示器配置來選擇顯示器支持不同的 RGB 色域。
7.2顯示設備和相機的色域一致
如果編碼視頻和播放視頻的顯示器采用的 RGB 色域是一致的,比如都是 sRGB,此時的播放過程相對比較簡單。
視頻解碼之后:得到 YUV 數據,然后根據標準將 YUV 數據轉換成非線性的 sRGB 數據,然后顯示器根據 sRGB 數據顯示圖像即可。
7.3顯示設備和相機的色域不一致
當顯示設備支持的色域從 sRGB 變為 Rec. 2020 時,如果直接顯示 sRGB 色域下的數據,則會導致比較嚴重的顏色失真。
和轉碼階段的色域轉換類似,此時,也需要在不同的色域空間進行 RGB 數據的轉換(色彩管理)以保證相同的視頻在不同輸入、輸出、顯示設備上都呈現出最好的顏色。
對于顯示設備而言,sRGB->RGB(Rec. 2020)的轉換過程如下所示:
因此:對于拍攝設備和顯示設備的色域不同時,視頻的播放增加了顏色管理的過程。
8、視頻觀看
雖然視頻信息的采集和最終終端播放采用的都是 RGB 的顏色模型,但是對人眼而言,RGB 其實并不直觀,比如我們很難馬上反應出天青色的 RGB 色值?
為了能夠更直觀的表示顏色,又引入了 HSL 色彩模型。
HSL 比 RGB 更加直觀,比如:想從黃色過度到紅色,只需要調整色相即可,飽和度和亮度保持不變。因此,HSL 一般更適合人的色彩感知,而 RGB 更適合顯示領域。
為了讓作品可以呈現出期望的效果,提升用戶的視覺體驗,在攝影后期,使用 HSL 對作品進行調整是最方便的一種方式。利用 HSL 對作品進行調整,簡單幾步就可以讓灰暗的「馬路隨拍」秒變「街頭大片」。
FFMpeg 的 signalstats 濾鏡可以分析獲取視頻的色調、飽和度、亮度信息。但是該濾鏡獲取的色調、飽和度和 HSL 中的計算 是不一致的。
signalstats 計算色調、飽和度的算法如下所示:
如果需要得到視頻的標準 HSL 信息,可以使用作者開發的 vf_hsl 濾鏡。
9、本文小結
雖然顏色還是那個顏色,但是不同的顏色空間的適用范圍并不相同。
具體是:
- 1)RGB:面向采集和顯示設備;
- 2)YUV:面向存儲;
- 3)HSL:面向人類視覺感知;
- 4)XYZ:RGB之間的轉換橋梁。
從視頻采集到視頻消費的整個過程,涉及到不同的設備和標準,而不同的設備和標準所支持的色域空間又不相同。
正是通過不同的顏色模型轉換和不同的色域轉換,才得以讓我們實現:在不同輸入、輸出、顯示設備上都呈現出最好的顏色,并以*似相同的觀看體驗來消費視頻。
10、參考文獻
[1] CMOS Image Sensor原理簡述
[2] 數字視頻導論
[3] 用HSL調色=簡單、快速、超出片
[4] 零基礎入門:實時音視頻技術基礎知識全面盤點
[5] 實時音視頻面視必備:快速掌握11個視頻技術相關的基礎概念
[6] 輕松詼諧,講解視頻編解碼技術的過去、現在和將來
[7] 寫給小白的實時音視頻技術入門提綱
[8] 福利貼:最全實時音視頻開發要用到的開源工程匯總
[9] 詳解音頻編解碼的原理、演進和應用選型
[10] 零基礎,史上最通俗視頻編碼技術入門
(本文已同步發布于:http://www.52im.net/thread-4467-1-1.html)