1. 程式人生 > >色彩校正中的 gamma 值是什麼

色彩校正中的 gamma 值是什麼

@Avatar Ye想要講解gamma的來龍去脈,可惜講錯了,誤導了很多人。

他文章的核心意思是說:

人眼特性使得我們需要gamma校正,CRT顯示器剛好自帶我們需要大小的gamma,好巧啊。

為什麼是2.2?因為CRT是2.2呀。所以現在全球用2.2的gamma實際上是因為老式CRT的物理特性。

@Avatar Ye認為:人眼特性決定了我們需要對影象提亮,而且老式CRT顯示器又怎麼這麼巧剛好自帶壓暗,這樣一亮一暗剛好抵消,資訊會沿45°的斜線,線性的呈現出來,老式CRT的物理缺陷太棒了。

這一點說的不太準確。

在Gamma校正發展的歷史中的確有美妙的巧合,維基百科中:

The similarity of CRT physics to the inverse of gamma encoding needed for video transmissionwas a combination of luck and engineering
which simplified the electronics in early television sets.

譯:

老式CRT顯示器會把訊號壓暗的物理特性,和CRT自帶的Gamma數值剛好與解碼攝影訊號所需的Gamma數值大小差不多這件事,既有運氣成分,也離不開工程學的設計,這個美妙的巧合大大簡化了早期電視機的電路工程設計

這個巧合實際上是這麼回事:

我們為了正確的顯示灰階,人眼要求顯示器Gamma是2.2上下,而巧合的是,老式的CRT顯示器剛好自帶一個2.35-2.55左右的物理gamma,已經非常接近2.2了。所以當一個被提亮過的圖片輸入到一個完全沒經過調校的CRT顯示器裡的時候,經過抵消,我們看上去,圖片只是“稍微有點暗”,稍微一補償

,給一個0.85左右的提亮gamma,畫面看起來就對了這個巧合使得早期設計電視機的工程師省了好大的事情。這才是Gamma的故事中,那個美妙的巧合。

=============================================================2015.4.18更新引用評論區中 @Ida Lin 的話 “至於說矯正規律是巧合還是幸運也好,其實本質是因為發現了電子映象管的強度總可以以一個冪指數來很好的擬合,如果發現不是其他很複雜的非線性關係,確實編碼的矯正方法就會難辦一些。”這才真是說到點子上了。要說巧合,這個確實才是根源。=============================================================

第二個關鍵問題,為什麼gamma是2.2呢?

那麼為什麼是2.2的倒數?因為老式的 CRT 顯示器。陰極管顯示器有一個物理特性——輸入值和輸出值呈現指數關係,這個指數是2.2。也就是說,當你輸入0.5的亮度,在螢幕上得到的不是0.5,而是0.5的2.2次方,約等於0.218。
他認為現在流行的gamma2.2是CRT的物理性質決定的,慢慢普及並被沿用了下來。

這一點因果邏輯徹底說錯了。

實際上gamma=2.2的原因,是人眼人眼是因,CRT的gamma是果。

人們Gamma校正的目的,無論是拍攝還是顯示器再現,都是為了人眼看著舒服,所有的數值都是目測調出來的,人眼才是決定者,這是很明顯的邏輯,也是常識。

2.2具體數值怎麼來的?

人眼特性決定的。具體數值怎麼來的?模擬使用者使用環境,測試,最終把顯示器調到一個看起來舒服的值最終實驗出來是2.2,據此,微軟和惠普於1996年釋出了sRGB標準,規定了8點陣圖片的標準是gamma≈2.2,從此以後,本來gamma百花齊放的顯示器和攝像機的gamma就都沿用了2.2,這也就是今天各位所看到的滿大街的gamma=2.2。所以結論就是,視覺感受決定了攝影機gamma0.454左右,顯示器gamma2.2左右,1996年以後才有了統一的gamma標準。這才是gamma=2.2的來龍去脈。@benman 的答案太好了,從中學到了好多,這個問題真的是工程師答最合適,很多一直想不通也不知去哪看的困惑全都解決了。感謝!

================以下是我最初的答案================

Gamma是什麼?

一開始,它是一個專有名詞,後來被廣泛運用於影象灰度對映的校正。巨集觀上我們看到的就是,Gamma變了,影象亮度就跟著變了,本質上是資訊的對映關係在數學上變了。以下是正文:

Gamma是在計算機圖形領域最不容易被理解掌握的概念之一,其中有很大一部分原因要怪它到處出現,極容易讓人混淆。Gamma的最初定義如下:“Gamma是用來描述顯示裝置的‘非線性’程度的專有名詞”。這是歷史上Gamma所擁有的第一個定義。但是很顯然這樣的一個定義並不能解釋清楚任何的問題。

那麼要解釋清楚Gamma,首先要解釋的就是顯示裝置的“非線性”。

一切的顯示裝置,比如計算機的顯示螢幕、手機或平板電腦的螢幕、老式的陰極攝像管電視機(CRT電視機),或是新式的液晶螢幕電視機,都是“非線性的”。以最為典型的CRT(Cathode ray tube陰極射線管)顯示螢幕為例(無論是電腦或者電視機),所謂“非線性”即意味著,如果施加在陰極攝像管的電壓強度 V 增加1倍,螢幕表面所輸出的光強度 I 並不會很理想的相應增加一倍。

圖01:CRT(Cathode ray tube:陰極射線管)顯示器示意圖

反過來說,如果顯示器所用到的發光元件是一個理想的物理模型,在輸入電訊號強度V(Voltage,電壓)和輸出的光照強度I(Intensity,強度)轉化過程中,V與I的比值是一個常數k,這裡我們就可以說這個發光元件是一個線性元件,轉化是線性轉化,是對電訊號的“無損轉化”。表達成公式如下:

I=kV

表達通俗一點,以上公式表示這樣一個意思:在理想的線性的顯示元件中,一份電壓強度可以生成一份相對應的光照強度,電壓翻幾倍,光照強度也會相應跟著翻幾倍。

當然現實世界中的任何顯示器都不會有這樣理想的特性,幸運的是,這些有損的顯示元件的輸入電壓V 與輸出光照強度 I 的對應關係在數學上呈現簡單的規律,用公式表達是這樣:

I=kV^\gamma

可以看到非線性顯示元件的輸入-輸出公式與線性顯示元件的公式非常相近,唯一的不同就是在輸入訊號V的右上角多了一個指數γ,這個希臘字母γ讀作Gamma(中文音“伽馬”),它便是用來描述非線性元件輸入訊號 V 在轉化成光線強度 I 過程中“非線性”程度的唯一一個引數。

表達通俗一點就是說,非線性顯示元件呈現這樣的規律:輸入電訊號V的大小在乘方Gamma和乘以常數k之後,會得到相對應的輸出訊號 I,無論輸入電壓的大小與否,一個非線性元件的訊號損耗特性Gamma是固定的。

然而不同的顯示裝置,Gamma的大小是不盡相同的,常見的Gamma大小可能會在1.4到2.6之間,蘋果電腦顯示器的Gamma在1,8左右,傳統CRT電視機的Gamma在2.35-2.55之間。總結來說,Gamma是跟著硬體裝置走的,和電壓以及光強度沒有關係。

那麼到這裡,我們就終於能理解為什麼Gamma的定義是“用來描述顯示裝置非線性程度的專有名詞”了,理想的顯示元件,電訊號以線性比例對應光強度,Gamma=1,而現實世界中非線性的顯示元件,Gamma≠1,Gamma越大,訊號損失越大,訊號的“失真”程度越高,因此Gamma就可以用來表示一個顯示元件對訊號的失真程度

這裡必須要強調的是:理想的,訊號無損的顯示元件”,並不是說在電壓到光強度的轉化過程中毫無能量損失,而是隻要電壓以k倍轉化為相對應的光強度就可以,一份電壓對應一份光強即可,等比例轉化即可,即 y=kx 的線性對映,此時Gamma是等於1的。

而非線性顯示元件在得到輸出光強 I 之前,需要把輸入電壓 V 在k倍的基礎上,右上角再次乘方一個Gamma,那麼此時這個Gamma可以比1大,亦可以比1小。

在計算機圖形學中,輸入的電壓訊號 V 和輸出的亮度訊號 I 都是在0-1(這個0就對應著電壓為0,顏色為黑色,1就對應著電壓為最大,光強度最高,顏色為白色)區間浮動的,如果這樣描述問題的話,我們連公式中間的常數k都可以忽略不計了,輸入-輸出的公式就簡化成了:

那麼這個公式下,就會有如下簡單的結論(中學常識):

我們能夠看到這樣的簡單規律:

在0-1區間中

Gamma=1時,輸入和輸出訊號是線性對應的,輸入等於輸出,訊號沒有“失真”。

當Gamma>1時,輸出的訊號總小於輸入訊號,大於1的Gamma會把輸入訊號失真得更小,輸出亮度 I 會比預期的更暗。此時我們不妨稱大於1的Gamma為“壓暗Gamma”

而另有一種Gamma是小於1的,當Gamma<1時,輸出訊號在函式值上呈現上拱形態,總比輸入訊號更大,相當於訊號被“放大”了,使用小於1的Gamma,可以讓輸出的結果更亮,那麼這種小於1的Gamma,可以被稱為“提亮Gamma”

你如果很熟悉Photoshop的曲線工具,那麼相信你能很容易的聯想到,0-1區間的Gamma小於1所對應的函式圖象非常類似於(雖然非常不準確,只是為了打個形象的比方)PS軟體在RGB模式下把曲線工具的中心點上提,輸入端(原圖)的數值會被變大後對映到輸出結果(調色後的結果),結果畫面就變亮了。

那麼現在回過頭來總結一下:

1. 先有了顯示裝置,人們發現不同的顯示裝置有自己固有的失真程度,通過實踐發現,其輸入-輸出的對應規律非常簡單,可以用

I=kV^\gamma

來描述,於是Gamma這個概念最初被用來描述硬體的失真程度。

2. 又因為在計算機圖形領域,0對應黑,1對映到白,那麼在0-1區間之間:

Gamma=1,y=x,輸出等於輸入。影象內容不變。

Gamma>1,y<x,數學上輸出結果比輸入要小。直觀感受上影象就變暗了。

Gamma<1,y>x,數學上輸出結果更大。直觀上影象就變亮了。

這裡必須再次強調是0-1區間,否則亮暗結論就全相反了,你懂的。

所以後來Gamma的作用就擴大化了,Gamma就變成了一個非常好用的用來校正畫面明暗程度的數學工具。

想要調整畫面的灰度和訊號之間的對映關係,只需要調整Gamma就可以了。

那麼我們再來看一下Photoshop中的色階工具:

輸入端左右兩邊的小三角,一個是黑點,一個是白點,我們都很熟悉,中間那個灰三角,定的就是中灰點,當你拖動它的時候,畫面的亮度會隨之變化,預設寫著1.00的位置,就是當前的Gamma,此時Gamma=1.00。

當你鍵入2.2的時候,畫面會變亮:

鍵入0.454(1/2.2)的時候,畫面會變暗:

等一下,說好的大於1會變暗,Gamma小於1是變亮啊。怎麼反過來了。(感謝 @烈之斬 )

維基百科上說:

Without context, a value labeled gamma might be either the encoding or the decoding value. Caution must be taken to correctly interpret the value as that to be applied-to-compensate or to be compensated-by-applying its inverse. In common parlance, in many occasions the decoding value (as 2.2) is employed as if it were the encoding value, instead of its inverse (1/2.2 in this case), which is the real value that must be applied to encode gamma.
在不做特殊說明的時候,預設一個Gamma值既代表編碼又代表解碼。在到底使用這個gamma值做補償還是用它的倒數做修正的選擇上務必要謹慎。習慣術語中,往往使用解碼gamma做代表(例如2.2),編碼gamma也說成gamma2.2,而不是說編碼Gamma的實際值(例如1/2.2)。

計算機在內部處理的時候,是首先把8位/通道影象的255白對映到1,把色階面板中的input gamma換算成倒數數值來計算的,input gamma輸入2.2,實際參與計算的是1/2.2≈0.454。那麼此時區間換算成0-1,gamma也自然是是小於1提亮,大於1壓暗。

在Photoshop中開啟曝光度調板,會看到:

其中第三行,中文版叫“灰度係數校正”,這個“灰度係數”其實就是Gamma。

總之,就像之前總結的,Gamma是一個非常好用的用來校正畫面明暗程度的數學工具。其實它也是唯一正確的用來校正畫面明暗程度的工具,影象的灰度關係本就應該是用冪函式來校正的。對於這一點如何解釋得更加透徹,還望對數學的本質領會的比較深刻的知友幫忙補充。我自己的感覺這就有點像正態分佈曲線是用來描述自然界的隨機變數分佈一樣,任取其中一小段區間,分佈還是正態曲線。以Gamma為冪增長的亮度,任取中間一小塊區間,還是以這個Gamma為冪增長的。

參考資料是:cs.princeton.edu/course作者是Alvy Ray Smith Alvy Ray Smith是計算機圖形界的鼻祖之一,皮克斯的聯合創始人之一,Alpha通道的發明,他也是參與者。