天天看點

關于視訊播放的伽馬——gamma校正關于視訊播放中的gamma

關于視訊播放中的gamma

我們在做視訊播放器過程中經常會看到有的播放器有gamma調整,通過gamma調整也能明顯覺察到視訊圖像顔色亮度等變化,但gamma對普通使用者太專業難懂,即時對開發人員來說gamma也是雲山霧罩,gamma到底是什麼,我們在程式設計的時候到底需不要考慮gamma調整,我們通過本篇文章循序漸進的走入gamma,基本上了解它。在需要調整的時候有理論依據。

gamma是什麼,産生的緣由

兩大理由産生了gamma:

1)為了資料壓縮

2)光電轉換特性

1)資料壓縮效率:

人眼對亮度敏感度不同,如果線性壓縮在高亮度區,占用太多空間,而人眼對高亮度區間不敏感。

我們用有限的數字描述無限連續的模拟世界,就是數字采樣,我們知道在現實世界中亮度從黑到白,我們用2bit來采樣,那隻有黑/灰/白,三種結果,如果用8bit,就有256個數字來描述變化,看到變化非常平滑,如果10bit/1024個數字描述将更平滑:

如果以固定步長均勻采樣我們稱之為線性采樣,例如亮度從0——1023,我們用10bit去描述這個亮度,步進1采樣,經過ADDA後肉眼看起來變化比較自然和平滑,但如果我們用8bit采樣,步進為4,我們就會發現在黑色區間的時候,人眼能夠看到亮度有突變(banding),在高亮度區間比較平滑。這樣的結果和人的感覺不符合,我們能感覺變化的應該增加更多的采樣來區分亮度,高亮度區間減少采樣,人眼也覺察不出差別。通俗點,從0亮度變到0.01亮度,人眼是可以察覺到的,但從0.99變到1.0,人眼可能就根本差别不出來,覺得它們是一個顔色。也就是說,人眼對暗部的變化更加敏感,而對亮部變化其實不是很敏感。

關于視訊播放的伽馬——gamma校正關于視訊播放中的gamma

即我們用更多的數值來描述暗區間,對于高亮區間減少描述值,這個和人眼特性相符和。

對應的采樣曲線如下圖所示:

關于視訊播放的伽馬——gamma校正關于視訊播放中的gamma

從圖所示,我們40%個采樣隻描述了10%的亮度,即用更多的數值去描述暗區間。

2)光電轉換特性

年長一點的同學都用crt顯示器,他發光顯示的原理是,使用一個電壓槍轟擊它螢幕上的一種圖層,這個圖層就可以發亮,每個像素點轟擊的電壓不同,亮度不同,我們這樣就看到了黑白圖像,那是否亮度和電壓成正比了,譬如我們将電壓提高兩倍,那麼亮度是否提高兩倍了,經測試電壓和亮度不成正比,那這就有問題了。

我們要顯示2倍的亮度,電壓提高多少?下面的圖像曲線辨別了轉換關系。

關于視訊播放的伽馬——gamma校正關于視訊播放中的gamma

從圖像上我們看到電壓和亮度成指數關系,看起來向x的2.5次方曲線。

我們驚奇的發現,為了人眼和數字化存儲效率我們弄出來的采樣曲線和光電轉換曲線竟然類似。自然界就是他媽這樣神奇哈。

我們想要的曲線是線性的,我們希望的圖形是這樣子的:

關于視訊播放的伽馬——gamma校正關于視訊播放中的gamma

這樣你給我的數值,我就給多少電壓,不需要計算,模拟實作友善。

沖突了,例如我們給40的電壓是想要40的亮度,可根據圖像2,隻産生了10的年度,這明顯和我想要的亮度不符合,亮度變暗了。腫莫辦?

大家記住,我們第一條資料壓縮是因為我們的采樣數不夠即描述亮度的數太少才需要,如果我們用32bit去描述亮度,我們其安全不用壓縮,沒個亮度都能有對應的數值來描述,精度分辨率完全夠用。但現實為了存儲效率,臣妾做不到啊。

第二點光電特性才是實體界真實存在的現象,是以我們為了能夠線性映射電壓和亮度即我們想要40的亮度就用40的電壓來描述:

brightness(40)= V(40)聰明的人類想了個好辦法我要40的亮度,你給40的電壓不行,那我就給75注意看圖,你用75的電壓不就産生40的亮度了嗎。

我們線性采集的亮度資料,我不直接給模拟裝置來顯示,我先做一次轉換補償,然後在給電壓,你缺多少我補多少,補完正好就是我們要的線性輸出了。

關于視訊播放的伽馬——gamma校正關于視訊播放中的gamma

1.真實場景我線性采集亮度資料

2.采集的資料我不直接存儲而是做一次編碼在存儲,這次編碼稱之為編碼gamma,例如我們采集的亮度值是40,我把他轉換成75。

3.播放的時候,顯示器給出75的電壓,

4.我們實際看到的是40的亮度。

為了給非線性的存儲和非線性的顯示個名字,我們稱之為:

a)編碼gamma

b)顯示gamma

編碼gamma變換曲線為:采集的信号通過這個曲線做編碼存儲,這個資料直接給到顯示器用來顯示

關于視訊播放的伽馬——gamma校正關于視訊播放中的gamma

顯示gamma曲線為:

關于視訊播放的伽馬——gamma校正關于視訊播放中的gamma

經過這兩個gamma變換正負補償,我們通過顯示器看的圖像和真實世界的圖像就對應起來了。

視訊中gamma校正

我們知道了gamma産生的原因,那就一個疑問是否每個顯示器的gamma調整曲線都是一緻的了,實際上如果顯示器标準和為了相容,我們要求顯示器具有标準的gamma值。

我們的内容在編碼制作的時候,使用的編碼gamma是0.45即x的0.45次方,也就是(1/2.2),我們的内容都是這麼制作的,那麼所有的顯示裝置要适配這個内容就必須支援這個gamma值,理論上我們認為顯示器的gamma值是2.2,這樣相乘等于1就是線性輸出了。但實際上顯示器的gamma值是2.5,這樣0.45*2.5=1.125,這個是因為我們電腦使用的色彩空間标準是sRGB,他要求的gamma是0.45,而crt的實體特性gamma是2.5.

現在lcd/led/雷射等顯示很多gamma已經不是2.5了,但為了相容,都需要通過硬體做映射再做一次轉換。

視訊為什麼在解碼輸出時候還要做gamma校正?

從上述描述中我們看已經還原了真實世界,那為啥還要做gamma修正了,呵呵,那是因為人對亮度的感覺沒個人是不同的。在明亮環境和黑暗環境也是不同的。

即個人喜好不同,相對亮度不同。

是以我們推薦,奧是大神推薦:電影院這種漆黑的環境中為1.5,在明亮的室内這個值為1.125。

我們也知道投影中有很多模式,明亮模式影院模式實際上都是調整的這個值。

為了我們播放電影效果好,我們可以适當加大暗度的分辨率減少亮度的分辨率使得看起來播放效果更好。

繼續閱讀