Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 499, comments - 13, trackbacks - 0, articles - 1

          本文由百度技術(shù)王偉分享,原題“視頻中為什么需要這么多的顏色空間?”,本文收錄時有修訂和改動。

          1、引言

          在視頻處理中,我們經(jīng)常會用到不同的色彩空間:非線性RGB,線性 RGB,YUV,XYZ……為什么需要這么多的色彩空間呢?為什么在 FFMpeg 中會有 color_space,color_transfer,color_primaries 等一系列的顏色屬性呢?這些術(shù)語之間究竟隱藏著什么秘密?

          本文將以通俗易懂的文字,引導(dǎo)你理解視頻是如何從采集開始,歷經(jīng)各種步驟,最終通過顏色模型轉(zhuǎn)換和不同的色域轉(zhuǎn)換,讓你看到賞心悅目的視頻結(jié)果的。

           
           
          技術(shù)交流:

          (本文已同步發(fā)布于:http://www.52im.net/thread-4467-1-1.html

          2、系列文章

          本文是系列文章中的第20篇,本系列文章的大綱如下:

          即時通訊音視頻開發(fā)(一):視頻編解碼之理論概述

          即時通訊音視頻開發(fā)(二):視頻編解碼之?dāng)?shù)字視頻介紹

          即時通訊音視頻開發(fā)(三):視頻編解碼之編碼基礎(chǔ)

          即時通訊音視頻開發(fā)(四):視頻編解碼之預(yù)測技術(shù)介紹

          即時通訊音視頻開發(fā)(五):認(rèn)識主流視頻編碼技術(shù)H.264

          即時通訊音視頻開發(fā)(六):如何開始音頻編解碼技術(shù)的學(xué)習(xí)

          即時通訊音視頻開發(fā)(七):音頻基礎(chǔ)及編碼原理入門

          即時通訊音視頻開發(fā)(八):常見的實時語音通訊編碼標(biāo)準(zhǔn)

          即時通訊音視頻開發(fā)(九):實時語音通訊的回音及回音消除概述

          即時通訊音視頻開發(fā)(十):實時語音通訊的回音消除技術(shù)詳解

          即時通訊音視頻開發(fā)(十一):實時語音通訊丟包補償技術(shù)詳解

          即時通訊音視頻開發(fā)(十二):多人實時音視頻聊天架構(gòu)探討

          即時通訊音視頻開發(fā)(十三):實時視頻編碼H.264的特點與優(yōu)勢

          即時通訊音視頻開發(fā)(十四):實時音視頻數(shù)據(jù)傳輸協(xié)議介紹

          即時通訊音視頻開發(fā)(十五):聊聊P2P與實時音視頻的應(yīng)用情況

          即時通訊音視頻開發(fā)(十六):移動端實時音視頻開發(fā)的幾個建議

          即時通訊音視頻開發(fā)(十七):視頻編碼H.264、V8的前世今生

          即時通訊音視頻開發(fā)(十八):詳解音頻編解碼的原理、演進和應(yīng)用選型

          即時通訊音視頻開發(fā)(十九):零基礎(chǔ),史上最通俗視頻編碼技術(shù)入門

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

          3、視頻采集

          如上圖所示,在相機系統(tǒng)中,外部世界的光信息(光子,photons)通過透鏡或其他光學(xué)器件聚焦之后達到相機的圖像傳感器(CCD 或者 CMOS)。

          過程是這樣的:

          • 1)圖像傳感器可以將一個入射光子(photon)轉(zhuǎn)換為對應(yīng)的一個電子(electron);
          • 2)在曝光時間內(nèi),圖像傳感器對轉(zhuǎn)換的電子進行電荷積累;
          • 3)然后,圖像傳感器會將積累的電荷信號轉(zhuǎn)換成對應(yīng)的電壓信號;
          • 4)最后,利用 ADC 把電信號轉(zhuǎn)換成數(shù)字信號,而轉(zhuǎn)換后的數(shù)字信號則為某個范圍內(nèi)的整數(shù)值。

          ADC 數(shù)字信號的取值范圍 :

          [pquote]ADC 轉(zhuǎn)換之后的數(shù)字信號的取值范圍受限于 ADC 設(shè)備。對于 8-bits 的 ADC 而言,數(shù)字信號的取值范圍為 [0, 2^8-1],因此,對于每一個像素而言,會用 [0, 255] 之間的整數(shù)來進行編碼。[/pquote]

          ADC 轉(zhuǎn)換的數(shù)字信號的數(shù)值是一個線性編碼的過程,這意味著如果將圖像傳感器上的光量增加 1 倍,則 ADC 轉(zhuǎn)換之后對應(yīng)的數(shù)值也會增加 1 倍。

          這是一個非常有用的特性:無論是增加物理世界的光量,還是增加 ADC 轉(zhuǎn)換之后的數(shù)值,對圖片而言,都會帶來相同的效果。線性編碼意味著我們所處理的數(shù)據(jù)和光發(fā)射的強度成正比關(guān)系。

          由數(shù)碼相機中的 CMOS 傳感器產(chǎn)生并寫入原始文件(Raw File)的數(shù)據(jù)是線性的。與普通照片相比,線性數(shù)據(jù)通常看起來非常暗且對比度較低。

          在 iPhone 手機中,可以通過設(shè)置相機來拍攝 Apple ProRAW 格式的照片。

          4、探索視頻伽馬校正

          研究表明:人類視覺系統(tǒng)是以對數(shù)函數(shù)的方式來感知光亮度。這意味著:人眼會提高暗部的敏感度,降低高光部分的敏感度。

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

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

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

          RGB 的設(shè)備依賴性 :

          不同顯示設(shè)備支持的色域空間不同,因此對于不同的顯示設(shè)備而言,伽馬校正之后的 RGB 數(shù)值也不同。從這個角度講,RGB 是設(shè)備依賴型的色彩空間。

          5、視頻壓縮

          根據(jù)如上的信息,我們知道:相機系統(tǒng)經(jīng)過 ISP 處理之后,最終會得到非線性的 RGB 信息。對于視頻而言,如果以 RGB 存儲每幀的信息,則需要消耗大量的存儲空間。

          人類視覺系統(tǒng)對顏色信息的敏感度要弱于亮度信息。利用這一特點,通常相機會將捕獲的 RGB 信息轉(zhuǎn)換為 YUV 格式,然后對 YUV 格式進行色度信息采樣(例如,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)中,不但會規(guī)定 RGB->YUV 的轉(zhuǎn)換系數(shù),同時還會規(guī)定從線性 RGB 到非線性 RGB 轉(zhuǎn)換的 gamma 系數(shù)。

          將 RGB顏色模型,轉(zhuǎn)換成 YUV 模型后,接下來會采用某種視頻編解碼算法(例如,H265, VP9)對獲取的數(shù)據(jù)進行視頻編碼,最終得到視頻文件(此處忽略了音頻的采集編碼以及合流的操作)。

          6、視頻轉(zhuǎn)碼

          出于各種原因,例如:

          • 1)終端用戶的帶寬受限;
          • 2)終端用戶支持的視頻編解碼算法和相機壓縮視頻的編解碼算法不一致;
          • 3)……

          一般不會直接把相機產(chǎn)出的視頻文件分發(fā)給用戶去消費。媒體服務(wù)商會對相機生成的視頻文件進行轉(zhuǎn)碼,然后選擇合適的轉(zhuǎn)碼后的視頻分發(fā)給終端消費用戶。

          在視頻轉(zhuǎn)碼階段,如果我們希望對原視頻進行色域的變換,例如從 BT. 601 轉(zhuǎn)碼為 BT. 709,則需要在不同色域的 RGB 數(shù)值之間進行轉(zhuǎn)換。

          在不同的色域空間進行 RGB 數(shù)據(jù)的轉(zhuǎn)換,這也就是我們所說的 色彩管理。色彩管理會對圖像進行色彩管理以適配當(dāng)前環(huán)境下的顏色效果,從而保證同一張圖片在不同輸入、輸出上都呈現(xiàn)出最好的顏色。

          色彩轉(zhuǎn)換需要在某個線性空間下進行操作,并且操作過程需要保持設(shè)備的獨立性。因此,不同的 RGB 色域空間是不能直接進行轉(zhuǎn)換的,需要一個設(shè)備無關(guān)、線性的顏色模型作為中轉(zhuǎn)才能實現(xiàn)其轉(zhuǎn)換。

          而 XYZ(CIE 1931 XYZ color space)具備設(shè)備無關(guān)、線性操作的特性。

          在 FFMpeg 中,主要使用 colorspace 濾鏡 來完成不同色域空間的轉(zhuǎn)換。

          根據(jù) colorspace 的實現(xiàn)可知,在 FFMpeg 中,BT. 601->BT. 709 的轉(zhuǎn)換過程如下所示:

          在如上的變換中,涉及到 3 個顏色空間的轉(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 還用來存儲視頻中對應(yīng)像素的每個分量的取值范圍。

          在 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ā)到終端用戶進行消費。

          對于大部分顯示設(shè)備,例如CRT顯示器、LCD、OLED,屏幕上的每個像素都是通過驅(qū)動三個非常靠*但仍然分開的小型 RGB 光源而構(gòu)建的。

          因此:顯示屏(監(jiān)視器、電視機、屏幕等等)僅使用 RGB 模型,并以不同的方式來組織,并顯示最終的圖像。

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

          7.2顯示設(shè)備和相機的色域一致

          如果編碼視頻和播放視頻的顯示器采用的 RGB 色域是一致的,比如都是 sRGB,此時的播放過程相對比較簡單。

          視頻解碼之后:得到 YUV 數(shù)據(jù),然后根據(jù)標(biāo)準(zhǔn)將 YUV 數(shù)據(jù)轉(zhuǎn)換成非線性的 sRGB 數(shù)據(jù),然后顯示器根據(jù) sRGB 數(shù)據(jù)顯示圖像即可。

          7.3顯示設(shè)備和相機的色域不一致

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

          和轉(zhuǎn)碼階段的色域轉(zhuǎn)換類似,此時,也需要在不同的色域空間進行 RGB 數(shù)據(jù)的轉(zhuǎn)換(色彩管理)以保證相同的視頻在不同輸入、輸出、顯示設(shè)備上都呈現(xiàn)出最好的顏色。

          對于顯示設(shè)備而言,sRGB->RGB(Rec. 2020)的轉(zhuǎn)換過程如下所示:

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

          8、視頻觀看

          雖然視頻信息的采集和最終終端播放采用的都是 RGB 的顏色模型,但是對人眼而言,RGB 其實并不直觀,比如我們很難馬上反應(yīng)出天青色的 RGB 色值?

          為了能夠更直觀的表示顏色,又引入了 HSL 色彩模型。

          HSL 比 RGB 更加直觀,比如:想從黃色過度到紅色,只需要調(diào)整色相即可,飽和度和亮度保持不變。因此,HSL 一般更適合人的色彩感知,而 RGB 更適合顯示領(lǐng)域。

          為了讓作品可以呈現(xiàn)出期望的效果,提升用戶的視覺體驗,在攝影后期,使用 HSL 對作品進行調(diào)整是最方便的一種方式。利用 HSL 對作品進行調(diào)整,簡單幾步就可以讓灰暗的「馬路隨拍」秒變「街頭大片」。

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

          signalstats 計算色調(diào)、飽和度的算法如下所示:

          如果需要得到視頻的標(biāo)準(zhǔn) HSL 信息,可以使用作者開發(fā)的 vf_hsl 濾鏡。

          9、本文小結(jié)

          雖然顏色還是那個顏色,但是不同的顏色空間的適用范圍并不相同。

          具體是:

          • 1)RGB:面向采集和顯示設(shè)備;
          • 2)YUV:面向存儲;
          • 3)HSL:面向人類視覺感知;
          • 4)XYZ:RGB之間的轉(zhuǎn)換橋梁。

          從視頻采集到視頻消費的整個過程,涉及到不同的設(shè)備和標(biāo)準(zhǔn),而不同的設(shè)備和標(biāo)準(zhǔn)所支持的色域空間又不相同。

          正是通過不同的顏色模型轉(zhuǎn)換和不同的色域轉(zhuǎn)換,才得以讓我們實現(xiàn):在不同輸入、輸出、顯示設(shè)備上都呈現(xiàn)出最好的顏色,并以*似相同的觀看體驗來消費視頻。

          10、參考文獻

          [1] CMOS Image Sensor原理簡述

          [2] 數(shù)字視頻導(dǎo)論

          [3] 用HSL調(diào)色=簡單、快速、超出片

          [4] 零基礎(chǔ)入門:實時音視頻技術(shù)基礎(chǔ)知識全面盤點

          [5] 實時音視頻面視必備:快速掌握11個視頻技術(shù)相關(guān)的基礎(chǔ)概念

          [6] 輕松詼諧,講解視頻編解碼技術(shù)的過去、現(xiàn)在和將來

          [7] 寫給小白的實時音視頻技術(shù)入門提綱

          [8] 福利貼:最全實時音視頻開發(fā)要用到的開源工程匯總

          [9] 詳解音頻編解碼的原理、演進和應(yīng)用選型

          [10] 零基礎(chǔ),史上最通俗視頻編碼技術(shù)入門


          (本文已同步發(fā)布于:http://www.52im.net/thread-4467-1-1.html



          作者:Jack Jiang (點擊作者姓名進入Github)
          出處:http://www.52im.net/space-uid-1.html
          交流:歡迎加入即時通訊開發(fā)交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處(也可前往 我的52im.net 找到我)。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 徐州市| 定西市| 天峻县| 杭锦后旗| 龙口市| 永川市| 遂川县| 稻城县| 藁城市| 翁牛特旗| 平潭县| 连云港市| 柳河县| 朝阳市| 平阴县| 樟树市| 牡丹江市| 大连市| 突泉县| 温宿县| 东方市| 大石桥市| 惠水县| 宜兴市| 新蔡县| 盐城市| 永昌县| 大邑县| 桦南县| 监利县| 连山| 嫩江县| 横峰县| 宁明县| 麻栗坡县| 保亭| 鄂伦春自治旗| 格尔木市| 赤峰市| 龙泉市| 铜山县|