作者 | 17哥
導(dǎo)讀:在視頻處理中,我們經(jīng)常會用到不同的色彩空間:非線性RGB,線性 RGB,YUV,XYZ……為什么需要這么多的色彩空間呢?為什么在 FFMpeg 中會有 color_space,color_transfer,color_primaries 等一系列的顏色屬性呢?這些術(shù)語之間究竟隱藏著什么秘密 ?
全文5840字,預(yù)計(jì)閱讀時(shí)間15分鐘。
01 視頻采集
如上圖所示,在相機(jī)系統(tǒng)中,外部世界的光信息(光子,photons)通過透鏡或其他光學(xué)器件聚焦之后達(dá)到相機(jī)的圖像傳感器(?CCD? 或者 CMOS)。[1]
-
圖像傳感器可以將一個(gè)入射光子(photon)轉(zhuǎn)換為對應(yīng)的一個(gè)電子(electron)。
-
在曝光時(shí)間內(nèi),圖像傳感器對轉(zhuǎn)換的電子進(jìn)行電荷積累。
-
然后,圖像傳感器會將積累的電荷信號轉(zhuǎn)換成對應(yīng)的電壓信號。
-
最后,利用 ADC 把電信號轉(zhuǎn)換成數(shù)字信號,而轉(zhuǎn)換后的數(shù)字信號則為某個(gè)范圍內(nèi)的整數(shù)值。
ADC 數(shù)字信號的取值范圍 :
ADC 轉(zhuǎn)換之后的數(shù)字信號的取值范圍受限于 ADC 設(shè)備。對于 8-bits 的 ADC 而言,數(shù)字信號的取值范圍為 [0, 2^8-1],因此,對于每一個(gè)像素而言,會用 [0, 255] 之間的整數(shù)來進(jìn)行編碼。
ADC 轉(zhuǎn)換的數(shù)字信號的數(shù)值是一個(gè)線性編碼的過程,這意味著如果將圖像傳感器上的光量增加 1 倍,則 ADC 轉(zhuǎn)換之后對應(yīng)的數(shù)值也會增加 1 倍。這是一個(gè)非常有用的特性:無論是增加物理世界的光量,還是增加 ADC 轉(zhuǎn)換之后的數(shù)值,對圖片而言,都會帶來相同的效果。線性編碼意味著我們所處理的數(shù)據(jù)和光發(fā)射的強(qiáng)度成正比關(guān)系。[2]
由數(shù)碼相機(jī)中的 CMOS 傳感器產(chǎn)生并寫入原始文件(Raw File)的數(shù)據(jù)是線性的。與普通照片相比,線性數(shù)據(jù)通常看起來非常暗且對比度較低。[3]
在 iPhone 手機(jī)中,可以通過設(shè)置相機(jī)來拍攝 Apple ProRAW 格式的照片。
02 探索視頻伽馬校正
實(shí)際上,研究表明,人類視覺系統(tǒng)是以對數(shù)函數(shù)的方式來感知光亮度。這意味著,人眼會提高暗部的敏感度,降低高光部分的敏感度。[4]
從數(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è)備依賴型的色彩空間。
03 視頻壓縮
根據(jù)如上的信息,我們知道:相機(jī)系統(tǒng)經(jīng)過 ISP 處理之后,最終會得到非線性的 RGB 信息。對于視頻而言,如果以 RGB 存儲每幀的信息,則需要消耗大量的存儲空間。
人類視覺系統(tǒng)對顏色信息的敏感度要弱于亮度信息,利用這一特點(diǎn),通常相機(jī)會將捕獲的 RGB 信息轉(zhuǎn)換為 YUV 格式,然后對 YUV 格式進(jìn)行色度信息采樣(例如,YUV420)以便壓縮圖像空間。
RGB->YUV,不同標(biāo)準(zhǔn)有不同要求,一般常用的標(biāo)準(zhǔn)有:
-
BT. 601(SD: Standard-Definition)
-
BT. 709(HD: High-Definition)
-
BT. 2020(UHD: Ultra-High-Definition)
注意 :
標(biāo)準(zhǔn)中,不但會規(guī)定 RGB->YUV 的轉(zhuǎn)換系數(shù),同時(shí)還會規(guī)定從線性 RGB 到非線性 RGB 轉(zhuǎn)換的 gamma 系數(shù)。
將 RGB顏色模型,轉(zhuǎn)換成 YUV 模型后,接下來會采用某種視頻編解碼算法(例如,H265, VP9)對獲取的數(shù)據(jù)進(jìn)行視頻編碼,最終得到視頻文件(此處忽略了音頻的采集編碼以及合流的操作)。
04 視頻轉(zhuǎn)碼
出于各種原因,例如:
-
終端用戶的帶寬受限
-
終端用戶支持的視頻編解碼算法和相機(jī)壓縮視頻的編解碼算法不一致
-
……
一般不會直接把相機(jī)產(chǎn)出的視頻文件分發(fā)給用戶去消費(fèi)。媒體服務(wù)商會對相機(jī)生成的視頻文件進(jìn)行轉(zhuǎn)碼,然后選擇合適的轉(zhuǎn)碼后的視頻分發(fā)給終端消費(fèi)用戶。[5]
在視頻轉(zhuǎn)碼階段,如果我們希望對原視頻進(jìn)行色域的變換,例如從 BT. 601 轉(zhuǎn)碼為 BT. 709,則需要在不同色域的 RGB 數(shù)值之間進(jìn)行轉(zhuǎn)換。[6]
在不同的色域空間進(jìn)行 RGB 數(shù)據(jù)的轉(zhuǎn)換,這也就是我們所說的 色彩管理。色彩管理會對圖像進(jìn)行色彩管理以適配當(dāng)前環(huán)境下的顏色效果,從而保證同一張圖片在不同輸入、輸出上都呈現(xiàn)出最好的顏色。[7]
色彩轉(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)換。[6:1]根據(jù) colorspace 的實(shí)現(xiàn)可知,在 FFMpeg 中,BT. 601->BT. 709 的轉(zhuǎn)換過程如下所示:
在如上的變換中,涉及到 3 個(gè)顏色空間的轉(zhuǎn)換,分別是:
-
YUV 和 RGB 之間的轉(zhuǎn)換
-
線性 RGB 和非線性 RGB 之間的轉(zhuǎn)換
-
線性 RGB 和 XYZ 之間的轉(zhuǎn)換
在 FFMpeg 中,所有的這些轉(zhuǎn)換參數(shù)都保存在 AVFrame 結(jié)構(gòu)中[8]:
-
AVFrame->colorspace 中保存了 YUV/RGB 的轉(zhuǎn)換矩陣
-
AVFrame->color_trc 中保存了線性 RGB 和非線性 RGB 之間的轉(zhuǎn)換函數(shù)(transformation characteristics)。
-
AVFrame->color_primaries 中保存了 RGB/XYZ 的轉(zhuǎn)換矩陣
如果用 ffprobe 命令解析視頻文件,則:
-
color_space 字段對應(yīng) YUV/RGB 的轉(zhuǎn)換矩陣
-
color_transfer 字段對應(yīng)線性 RGB 和非線性 RGB 之間的轉(zhuǎn)換函數(shù)
-
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 中,
-
Matrix coefficients 字段對應(yīng) YUV/RGB 的轉(zhuǎn)換矩陣
-
Transfer characteristic 字段對應(yīng)線性 RGB 和非線性 RGB 之間的轉(zhuǎn)換函數(shù)
-
Color primaries 字段對應(yīng) RGB/XYZ 的轉(zhuǎn)換矩陣
除了如上的參數(shù)外,AVFrame->range 還用來存儲視頻中對應(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"},
05 視頻解碼&播放
轉(zhuǎn)碼之后的視頻,可以通過各種渠道分發(fā)到終端用戶進(jìn)行消費(fèi)。對于大部分顯示設(shè)備,例如CRT顯示器、LCD、OLED,屏幕上的每個(gè)像素都是通過驅(qū)動(dòng)三個(gè)非??拷匀环珠_的小型 RGB 光源而構(gòu)建的。[9] 因此,顯示屏(監(jiān)視器,電視機(jī),屏幕等等)僅使用 RGB 模型,并以不同的方式來組織,并顯示最終的圖像。[10]
如前所述,不同的顯示設(shè)備采用的 RGB 的色域并不一定相同,因此,RGB 是一種設(shè)備依賴型的顏色模型。[11]在 Mac 電腦上,可以通過顯示器配置來選擇顯示器支持不同的 RGB 色域。
5.1 顯示設(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ù)顯示圖像即可。
5.2 顯示設(shè)備和相機(jī)的色域不一致
當(dāng)顯示設(shè)備支持的色域從 sRGB 變?yōu)?Rec. 2020 時(shí),如果直接顯示 sRGB 色域下的數(shù)據(jù),則會導(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í),視頻的播放增加了顏色管理的過程。
06 視頻觀看
雖然視頻信息的采集和最終終端播放采用的都是 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)整,簡單幾步就可以讓灰暗的「馬路隨拍」秒變「街頭大片」。[12]
FFMpeg 的 signalstats 濾鏡可以分析獲取視頻的色調(diào)、飽和度、亮度信息。但是該濾鏡獲取的色調(diào)、飽和度和 HSL 中的計(jì)算 是不一致的。
signalstats 計(jì)算色調(diào)、飽和度的算法如下所示:
如果需要得到視頻的標(biāo)準(zhǔn) HSL 信息,可以使用作者開發(fā)的 vf_hsl 濾鏡。
07 結(jié)語
雖然顏色還是那個(gè)顏色,但是不同的顏色空間的適用范圍并不相同:
-
RGB:面向采集和顯示設(shè)備
-
YUV:面向存儲
-
HSL:面向人類視覺感知
-
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)出最好的顏色,才得以讓我們實(shí)現(xiàn)以近似相同的觀看體驗(yàn)來消費(fèi)視頻。
——END——
參考文獻(xiàn):
-
CMOS Image Sensor原理簡述:https://zhuanlan.zhihu.com/p/158502818
-
What does linear RGB mean:https://discuss.pixls.us/t/what-does-linear-rgb-mean/16584
-
How Digital Cameras Work:https://www.astropix.com/html/astrophotography/how.html
-
Linear vs. Logarithmic Dimming—A White Paper:https://www.pathwaylighting.com/products/downloads/brochure/technical_materials_1466797044_Linear+vs+Logarithmic+Dimming+White+Paper.pdf
-
What is Video Transcoding and Why Do You Do It:https://medium.com/videocoin/what-is-video-transcoding-and-why-do-you-do-it-348a2610cefc
-
Talking About Colorspaces and FFmpeg:https://medium.com/invideo-io/talking-about-colorspaces-and-ffmpeg-f6d0b037cc2f
-
【顏色科學(xué)】RGB和XYZ顏色空間的轉(zhuǎn)換:https://blog.csdn.net/weixin_43194305/article/details/107944264????????
-
Colorspace support in FFmpeg:https://trac.ffmpeg.org/wiki/colorspace
-
RGB color model:https://en.wikipedia.org/wiki/RGB_color_model
-
數(shù)字視頻導(dǎo)論:https://wangwei1237.github.io/2020/02/28/Introduction-to-digital-video-technology/
-
Computational Color Technology:https://www.spiedigitallibrary.org/ebooks/PM/Computational-Color-Technology/eISBN-9780819481085/10.1117/3.660835文章來源:http://www.zghlxwxcb.cn/news/detail-412466.html
-
用HSL調(diào)色=簡單、快速、超出片:https://zhuanlan.zhihu.com/p/142767122文章來源地址http://www.zghlxwxcb.cn/news/detail-412466.html
到了這里,關(guān)于視頻中為什么需要這么多的顏色空間?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!