即時(shí)通訊音視頻開發(fā)(二十):一文讀懂視頻的顏色模型轉(zhuǎn)換和色域轉(zhuǎn)換

本文由百度技術(shù)王偉分享,原題“視頻中為什么需要這么多的顏色空間?”,本文收錄時(shí)有修訂和改動(dòng)。
1、引言
在視頻處理中,我們經(jīng)常會(huì)用到不同的色彩空間:非線性RGB,線性 RGB,YUV,XYZ……為什么需要這么多的色彩空間呢?為什么在 FFMpeg 中會(huì)有 color_space,color_transfer,color_primaries 等一系列的顏色屬性呢?這些術(shù)語之間究竟隱藏著什么秘密?
本文將以通俗易懂的文字,引導(dǎo)你理解視頻是如何從采集開始,歷經(jīng)各種步驟,最終通過顏色模型轉(zhuǎn)換和不同的色域轉(zhuǎn)換,讓你看到賞心悅目的視頻結(jié)果的。

?
?
技術(shù)交流:
- 移動(dòng)端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM》
- 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK(備用地址點(diǎn)此)
(本文已同步發(fā)布于:http://www.52im.net/thread-4467-1-1.html)
2、系列文章
本文是系列文章中的第20篇,本系列文章的大綱如下:
《即時(shí)通訊音視頻開發(fā)(一):視頻編解碼之理論概述》
《即時(shí)通訊音視頻開發(fā)(二):視頻編解碼之?dāng)?shù)字視頻介紹》
《即時(shí)通訊音視頻開發(fā)(三):視頻編解碼之編碼基礎(chǔ)》
《即時(shí)通訊音視頻開發(fā)(四):視頻編解碼之預(yù)測技術(shù)介紹》
《即時(shí)通訊音視頻開發(fā)(五):認(rèn)識(shí)主流視頻編碼技術(shù)H.264》
《即時(shí)通訊音視頻開發(fā)(六):如何開始音頻編解碼技術(shù)的學(xué)習(xí)》
《即時(shí)通訊音視頻開發(fā)(七):音頻基礎(chǔ)及編碼原理入門》
《即時(shí)通訊音視頻開發(fā)(八):常見的實(shí)時(shí)語音通訊編碼標(biāo)準(zhǔn)》
《即時(shí)通訊音視頻開發(fā)(九):實(shí)時(shí)語音通訊的回音及回音消除概述》
《即時(shí)通訊音視頻開發(fā)(十):實(shí)時(shí)語音通訊的回音消除技術(shù)詳解》
《即時(shí)通訊音視頻開發(fā)(十一):實(shí)時(shí)語音通訊丟包補(bǔ)償技術(shù)詳解》
《即時(shí)通訊音視頻開發(fā)(十二):多人實(shí)時(shí)音視頻聊天架構(gòu)探討》
《即時(shí)通訊音視頻開發(fā)(十三):實(shí)時(shí)視頻編碼H.264的特點(diǎn)與優(yōu)勢》
《即時(shí)通訊音視頻開發(fā)(十四):實(shí)時(shí)音視頻數(shù)據(jù)傳輸協(xié)議介紹》
《即時(shí)通訊音視頻開發(fā)(十五):聊聊P2P與實(shí)時(shí)音視頻的應(yīng)用情況》
《即時(shí)通訊音視頻開發(fā)(十六):移動(dòng)端實(shí)時(shí)音視頻開發(fā)的幾個(gè)建議》
《即時(shí)通訊音視頻開發(fā)(十七):視頻編碼H.264、V8的前世今生》
《即時(shí)通訊音視頻開發(fā)(十八):詳解音頻編解碼的原理、演進(jìn)和應(yīng)用選型》
《即時(shí)通訊音視頻開發(fā)(十九):零基礎(chǔ),史上最通俗視頻編碼技術(shù)入門》
《即時(shí)通訊音視頻開發(fā)(二十):一文讀懂視頻的顏色模型轉(zhuǎn)換和色域轉(zhuǎn)換》(* 本文)
3、視頻采集

如上圖所示,在相機(jī)系統(tǒng)中,外部世界的光信息(光子,photons)通過透鏡或其他光學(xué)器件聚焦之后達(dá)到相機(jī)的圖像傳感器(CCD 或者 CMOS)。
過程是這樣的:
1)圖像傳感器可以將一個(gè)入射光子(photon)轉(zhuǎn)換為對應(yīng)的一個(gè)電子(electron);
2)在曝光時(shí)間內(nèi),圖像傳感器對轉(zhuǎn)換的電子進(jìn)行電荷積累;
3)然后,圖像傳感器會(huì)將積累的電荷信號(hào)轉(zhuǎn)換成對應(yīng)的電壓信號(hào);
4)最后,利用 ADC 把電信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),而轉(zhuǎn)換后的數(shù)字信號(hào)則為某個(gè)范圍內(nèi)的整數(shù)值。
ADC 數(shù)字信號(hào)的取值范圍 :
[pquote]ADC 轉(zhuǎn)換之后的數(shù)字信號(hào)的取值范圍受限于 ADC 設(shè)備。對于 8-bits 的 ADC 而言,數(shù)字信號(hào)的取值范圍為 [0, 2^8-1],因此,對于每一個(gè)像素而言,會(huì)用 [0, 255] 之間的整數(shù)來進(jìn)行編碼。[/pquote]

ADC 轉(zhuǎn)換的數(shù)字信號(hào)的數(shù)值是一個(gè)線性編碼的過程,這意味著如果將圖像傳感器上的光量增加 1 倍,則 ADC 轉(zhuǎn)換之后對應(yīng)的數(shù)值也會(huì)增加 1 倍。
這是一個(gè)非常有用的特性:無論是增加物理世界的光量,還是增加 ADC 轉(zhuǎn)換之后的數(shù)值,對圖片而言,都會(huì)帶來相同的效果。線性編碼意味著我們所處理的數(shù)據(jù)和光發(fā)射的強(qiáng)度成正比關(guān)系。
由數(shù)碼相機(jī)中的 CMOS 傳感器產(chǎn)生并寫入原始文件(Raw File)的數(shù)據(jù)是線性的。與普通照片相比,線性數(shù)據(jù)通??雌饋矸浅0登覍Ρ榷容^低。

在 iPhone 手機(jī)中,可以通過設(shè)置相機(jī)來拍攝 Apple ProRAW 格式的照片。
4、探索視頻伽馬校正
研究表明:人類視覺系統(tǒng)是以對數(shù)函數(shù)的方式來感知光亮度。這意味著:人眼會(huì)提高暗部的敏感度,降低高光部分的敏感度。

從數(shù)學(xué)角度看,感知光強(qiáng)度和測量光強(qiáng)度之間存在一個(gè)*似的*方關(guān)系,具體如下式所示。

由于人類視覺感知系統(tǒng)不是以線性方式工作的,因此必須使用非線性曲線來對 ADC 生成的的線性數(shù)據(jù)進(jìn)行變換,從而使得拍攝的圖像色調(diào)與我們的視覺系統(tǒng)的工作方式相匹配。這個(gè)過程也就是我們所說的 伽馬校正。

因此:在從線性 RGB 空間轉(zhuǎn)換到非線性 RGB 空間時(shí),需要 γ 作為轉(zhuǎn)換參數(shù)。相機(jī)中的 ISP 模塊負(fù)責(zé)對圖像傳感器的線性 RGB 進(jìn)行伽馬校正進(jìn)而產(chǎn)生對應(yīng)的符合人眼感知的非線性 RGB 數(shù)據(jù)。

RGB 的設(shè)備依賴性 :
不同顯示設(shè)備支持的色域空間不同,因此對于不同的顯示設(shè)備而言,伽馬校正之后的 RGB 數(shù)值也不同。從這個(gè)角度講,RGB 是設(shè)備依賴型的色彩空間。
5、視頻壓縮
根據(jù)如上的信息,我們知道:相機(jī)系統(tǒng)經(jīng)過 ISP 處理之后,最終會(huì)得到非線性的 RGB 信息。對于視頻而言,如果以 RGB 存儲(chǔ)每幀的信息,則需要消耗大量的存儲(chǔ)空間。
人類視覺系統(tǒng)對顏色信息的敏感度要弱于亮度信息。利用這一特點(diǎn),通常相機(jī)會(huì)將捕獲的 RGB 信息轉(zhuǎn)換為 YUV 格式,然后對 YUV 格式進(jìn)行色度信息采樣(例如,YUV420)以便壓縮圖像空間。
RGB->YUV,不同標(biāo)準(zhǔn)有不同要求,一般常用的標(biāo)準(zhǔn)有:
1)BT. 601(SD: Standard-Definition);
2)BT. 709(HD: High-Definition);
3)BT. 2020(UHD: Ultra-High-Definition)。
注意 :
標(biāo)準(zhǔn)中,不但會(huì)規(guī)定 RGB->YUV 的轉(zhuǎn)換系數(shù),同時(shí)還會(huì)規(guī)定從線性 RGB 到非線性 RGB 轉(zhuǎn)換的 gamma 系數(shù)。
將 RGB顏色模型,轉(zhuǎn)換成 YUV 模型后,接下來會(huì)采用某種視頻編解碼算法(例如,H265, VP9)對獲取的數(shù)據(jù)進(jìn)行視頻編碼,最終得到視頻文件(此處忽略了音頻的采集編碼以及合流的操作)。

6、視頻轉(zhuǎn)碼
出于各種原因,例如:
1)終端用戶的帶寬受限;
2)終端用戶支持的視頻編解碼算法和相機(jī)壓縮視頻的編解碼算法不一致;
3)……
一般不會(huì)直接把相機(jī)產(chǎn)出的視頻文件分發(fā)給用戶去消費(fèi)。媒體服務(wù)商會(huì)對相機(jī)生成的視頻文件進(jìn)行轉(zhuǎn)碼,然后選擇合適的轉(zhuǎn)碼后的視頻分發(fā)給終端消費(fèi)用戶。
在視頻轉(zhuǎn)碼階段,如果我們希望對原視頻進(jìn)行色域的變換,例如從 BT. 601 轉(zhuǎn)碼為 BT. 709,則需要在不同色域的 RGB 數(shù)值之間進(jìn)行轉(zhuǎn)換。
在不同的色域空間進(jìn)行 RGB 數(shù)據(jù)的轉(zhuǎn)換,這也就是我們所說的 色彩管理。色彩管理會(huì)對圖像進(jìn)行色彩管理以適配當(dāng)前環(huán)境下的顏色效果,從而保證同一張圖片在不同輸入、輸出上都呈現(xiàn)出最好的顏色。
色彩轉(zhuǎn)換需要在某個(gè)線性空間下進(jìn)行操作,并且操作過程需要保持設(shè)備的獨(dú)立性。因此,不同的 RGB 色域空間是不能直接進(jìn)行轉(zhuǎn)換的,需要一個(gè)設(shè)備無關(guān)、線性的顏色模型作為中轉(zhuǎn)才能實(shí)現(xiàn)其轉(zhuǎn)換。
而 XYZ(CIE 1931 XYZ color space)具備設(shè)備無關(guān)、線性操作的特性。
在 FFMpeg 中,主要使用 colorspace 濾鏡 來完成不同色域空間的轉(zhuǎn)換。
根據(jù) colorspace 的實(shí)現(xiàn)可知,在 FFMpeg 中,BT. 601->BT. 709 的轉(zhuǎn)換過程如下所示:

在如上的變換中,涉及到 3 個(gè)顏色空間的轉(zhuǎn)換,分別是:
1)YUV 和 RGB 之間的轉(zhuǎn)換;
2)線性 RGB 和非線性 RGB 之間的轉(zhuǎn)換;
3)線性 RGB 和 XYZ 之間的轉(zhuǎn)換。
在 FFMpeg 中,所有的這些轉(zhuǎn)換參數(shù)都保存在 AVFrame 結(jié)構(gòu)中:
1)AVFrame->colorspace 中保存了 YUV/RGB 的轉(zhuǎn)換矩陣;
2)AVFrame->color_trc 中保存了線性 RGB 和非線性 RGB 之間的轉(zhuǎn)換函數(shù)(transformation characteristics);
3)AVFrame->color_primaries 中保存了 RGB/XYZ 的轉(zhuǎn)換矩陣;
如果用 ffprobe 命令解析視頻文件,則:
1)color_space 字段對應(yīng) YUV/RGB 的轉(zhuǎn)換矩陣;
2)color_transfer 字段對應(yīng)線性 RGB 和非線性 RGB 之間的轉(zhuǎn)換函數(shù);
3)color_primaries 字段對應(yīng) RGB/XYZ 的轉(zhuǎn)換矩陣。
$ 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 字段對應(yīng) YUV/RGB 的轉(zhuǎn)換矩陣;
2)Transfer characteristic 字段對應(yīng)線性 RGB 和非線性 RGB 之間的轉(zhuǎn)換函數(shù);
3)Color primaries 字段對應(yīng) RGB/XYZ 的轉(zhuǎn)換矩陣。
除了如上的參數(shù)外,AVFrame->range 還用來存儲(chǔ)視頻中對應(yīng)像素的每個(gè)分量的取值范圍。
在 vf_setparams.c 中也作了相關(guān)的定義說明:
{"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基本
轉(zhuǎn)碼之后的視頻,可以通過各種渠道分發(fā)到終端用戶進(jìn)行消費(fèi)。
對于大部分顯示設(shè)備,例如CRT顯示器、LCD、OLED,屏幕上的每個(gè)像素都是通過驅(qū)動(dòng)三個(gè)非???但仍然分開的小型 RGB 光源而構(gòu)建的。
因此:顯示屏(監(jiān)視器、電視機(jī)、屏幕等等)僅使用 RGB 模型,并以不同的方式來組織,并顯示最終的圖像。

如前所述:不同的顯示設(shè)備采用的 RGB 的色域并不一定相同,因此,RGB 是一種設(shè)備依賴型的顏色模型。在 Mac 電腦上,可以通過顯示器配置來選擇顯示器支持不同的 RGB 色域。

7.2顯示設(shè)備和相機(jī)的色域一致
如果編碼視頻和播放視頻的顯示器采用的 RGB 色域是一致的,比如都是 sRGB,此時(shí)的播放過程相對比較簡單。
視頻解碼之后:得到 YUV 數(shù)據(jù),然后根據(jù)標(biāo)準(zhǔn)將 YUV 數(shù)據(jù)轉(zhuǎn)換成非線性的 sRGB 數(shù)據(jù),然后顯示器根據(jù) sRGB 數(shù)據(jù)顯示圖像即可。

7.3顯示設(shè)備和相機(jī)的色域不一致
當(dāng)顯示設(shè)備支持的色域從 sRGB 變?yōu)?Rec. 2020 時(shí),如果直接顯示 sRGB 色域下的數(shù)據(jù),則會(huì)導(dǎo)致比較嚴(yán)重的顏色失真。

和轉(zhuǎn)碼階段的色域轉(zhuǎn)換類似,此時(shí),也需要在不同的色域空間進(jìn)行 RGB 數(shù)據(jù)的轉(zhuǎn)換(色彩管理)以保證相同的視頻在不同輸入、輸出、顯示設(shè)備上都呈現(xiàn)出最好的顏色。
對于顯示設(shè)備而言,sRGB->RGB(Rec. 2020)的轉(zhuǎn)換過程如下所示:

因此:對于拍攝設(shè)備和顯示設(shè)備的色域不同時(shí),視頻的播放增加了顏色管理的過程。

8、視頻觀看
雖然視頻信息的采集和最終終端播放采用的都是 RGB 的顏色模型,但是對人眼而言,RGB 其實(shí)并不直觀,比如我們很難馬上反應(yīng)出天青色的 RGB 色值?
為了能夠更直觀的表示顏色,又引入了 HSL 色彩模型。
HSL 比 RGB 更加直觀,比如:想從黃色過度到紅色,只需要調(diào)整色相即可,飽和度和亮度保持不變。因此,HSL 一般更適合人的色彩感知,而 RGB 更適合顯示領(lǐng)域。
為了讓作品可以呈現(xiàn)出期望的效果,提升用戶的視覺體驗(yàn),在攝影后期,使用 HSL 對作品進(jìn)行調(diào)整是最方便的一種方式。利用 HSL 對作品進(jìn)行調(diào)整,簡單幾步就可以讓灰暗的「馬路隨拍」秒變「街頭大片」。

FFMpeg 的 signalstats 濾鏡可以分析獲取視頻的色調(diào)、飽和度、亮度信息。但是該濾鏡獲取的色調(diào)、飽和度和 HSL 中的計(jì)算 是不一致的。
signalstats 計(jì)算色調(diào)、飽和度的算法如下所示:

如果需要得到視頻的標(biāo)準(zhǔn) HSL 信息,可以使用作者開發(fā)的 vf_hsl 濾鏡。
9、本文小結(jié)
雖然顏色還是那個(gè)顏色,但是不同的顏色空間的適用范圍并不相同。
具體是:
1)RGB:面向采集和顯示設(shè)備;
2)YUV:面向存儲(chǔ);
3)HSL:面向人類視覺感知;
4)XYZ:RGB之間的轉(zhuǎn)換橋梁。
從視頻采集到視頻消費(fèi)的整個(gè)過程,涉及到不同的設(shè)備和標(biāo)準(zhǔn),而不同的設(shè)備和標(biāo)準(zhǔn)所支持的色域空間又不相同。
正是通過不同的顏色模型轉(zhuǎn)換和不同的色域轉(zhuǎn)換,才得以讓我們實(shí)現(xiàn):在不同輸入、輸出、顯示設(shè)備上都呈現(xiàn)出最好的顏色,并以*似相同的觀看體驗(yàn)來消費(fèi)視頻。
10、參考文獻(xiàn)
[1]?CMOS Image Sensor原理簡述
[2]?數(shù)字視頻導(dǎo)論
[3]?用HSL調(diào)色=簡單、快速、超出片
[4]?零基礎(chǔ)入門:實(shí)時(shí)音視頻技術(shù)基礎(chǔ)知識(shí)全面盤點(diǎn)
[5]?實(shí)時(shí)音視頻面視必備:快速掌握11個(gè)視頻技術(shù)相關(guān)的基礎(chǔ)概念
[6]?輕松詼諧,講解視頻編解碼技術(shù)的過去、現(xiàn)在和將來
[7]?寫給小白的實(shí)時(shí)音視頻技術(shù)入門提綱
[8]?福利貼:最全實(shí)時(shí)音視頻開發(fā)要用到的開源工程匯總
[9]?詳解音頻編解碼的原理、演進(jìn)和應(yīng)用選型
[10]?零基礎(chǔ),史上最通俗視頻編碼技術(shù)入門
(本文已同步發(fā)布于:http://www.52im.net/thread-4467-1-1.html)