令人迷惑的Gamma

bzyzhang發表於2020-04-20

概述

首先我想說,接觸到Gamma的概念也很長時間了,一直沒有認真的去學習它。知其然而不知其所以然。最近恰巧學到了這一部分,就想徹底地搞懂它。

CRT

說起Gamma,肯定離不開CRT(陰極射線管)。

CRT(陰極射線管)是大多數計算機顯示器、視訊監視器、電視接收器和示波器中使用的顯示裝置,由德國科學家 Karl Ferdinand Braun於1897年發明。它的特點是熒光屏被加熱的陰極發射的電子束照射時發出可見光。電子被集中在一束光中,這束光在磁場的作用下發生偏轉,掃描被磷光材料覆蓋的觀察端(陽極)。當電子撞擊這種材料時,就會發出光來。
在電視陰極射線管(CRT)中,整個映象管區域以一種固定的模式被掃描,這種模式被稱為光柵。通過視訊訊號調節電子束的強度,就可以產生一幅影像。在現代的電視機中,電子束是通過一個磁軛(一組由電子電路驅動的線圈)作用在電子管頸上的磁場來掃描的。彩色陰極射線管使用三種不同的材料,分別發出綠色、藍色和紅色的光,緊密地排列在條狀(在孔徑格柵設計中)或簇狀(在蔭罩陰極射線管中)。有三支電子槍,每種顏色一支,每支電子槍只能打到一種顏色的點。

在電視的早期,人們發現陰極射線管不會產生與輸入電壓成比例的光強。視訊訊號與陰極射線管產生的光(傳遞函式)之間的關係是非線性的,通常用冪定律來描述:

\[Light \quad intensity = Volt^{\gamma} \]

Gamma(γ)的值為2.8 (PAL和SECAM制式)或2.2 (NTSC)。傳遞函式通常被稱為曲線。它是由電子槍內部的靜電效應引起的。這種關係的圖形,如下所示:

按照這種關係,最後螢幕上顯示的亮度會比預期中的更暗。

比如如果是線性關係的話,50%亮度的入射光應該輸出50%的亮度;但是按照這個指數關係,\(50 \%^{2.2} = 21.8 \%\),實際上在CRT顯示器上只會輸出21.8%的亮度,還不到預期亮度的一半!

Gamma編碼

人們發現了CRT的問題,必然要想辦法解決。

可以想到的一種解決方法是,改變CRT顯示器,使其可以線性輸出。但當時已經存在很多的CRT顯示器,重新改造的話,不是很現實。考慮到當時的情況,影像採集裝置,例如相機,並不是很多,能不能對其進行改良,來解決CRT的Gamma問題呢?答案是肯定的。

圖形採集裝置,採集到的現實中的亮度,是線性的。在需要將採集到的資料儲存之前,可以進行Gamma編碼,它也符合冪定律:

\[V_{encode} = V_{Linear}^{\frac{1}{\gamma}} \]

用影像表示這種關係的話,如下:

問題來了,這樣為什麼可以解決CRT的Gamma問題呢?

從數學上來看,儲存影像時,要進行的操作是:

\[V_{encode} = V_{linear}^{\frac{1}{\gamma}} \]

將影像顯示到螢幕上,要進行的操作是:

\[V_{linear} = V_{encode}^{\gamma} \]

所以,最後螢幕上輸出的,是線性的。這個過程如下圖所示:

這樣,就可以解決CRT的Gamma問題了。

許多文章提到Gamma編碼與人類視覺對亮度的非線性響應有關。這是不準確的。

這種混淆很可能源於Gamma編碼(大約\(x^{0.45}\))和人類視覺(大約\(x^{0.42}\))之間非常相似的指數關係——但這只是巧合。

話雖如此,這種類似的關係確實有一個顯著的好處。由於Gamma編碼重新分配的色調水平更接近我們的眼睛如何感知它們,我們對暗部的表達更精細,而對亮部的表達會比較簡單。

這是因為人類的視覺對暗部的變化比亮部的變化更敏感。通過以與我們的視覺系統相匹配的方式對資料進行編碼,色調值可以更有效地分佈。換句話說,在亮部,我們很難看到細微的差別;然而,在暗部,我們卻能探測到同樣的絕對變化。因此,即使在更高的亮度級別上有更少的色調,我們也不會感知到任何差異。

所以,同等頻寬/儲存空間的前提下,儘量儲存更多的暗部的資訊可以給人帶來更多的資訊量。

Gamma編碼的圖形表示如下。可以看到,在輸入x比較低的時候,y有更大的增長性;而在x比較大的時候,y的增長性就比較平緩了。所以我們可以使用更多的空間來處理暗部的資訊。

重要的是要記住,這不是我們Gamma編碼影像的原因,只是一個有趣的副作用。

sRGB (standard Red Green Blue)

sRGB是一個彩色空間,是當今消費電子裝置,事實上的標準,包括顯示器、數位相機、掃描器、印表機和手持裝置。它也是網際網路上影像的標準顏色空間。

sRGB規範定義了使用什麼Gamma來對sRGB影像進行編碼和解碼。sRGB的Gamma非常接近標準Gamma2.2。

因為顯示器總是在sRGB空間中顯示應用了Gamma的顏色,無論什麼時候當你在計算機上繪製、編輯或者畫出一個圖片的時候,你所選的顏色都是根據你在顯示器上看到的那種。這實際意味著所有你建立或編輯的圖片並不是線上性空間,而是在sRGB空間中,假如在你的螢幕上對紅色翻一倍,就是根據你所感知到的亮度進行的,並不等於將紅色元素加倍。

這裡考慮兩種情況,一種情況是,影像是影像採集裝置(如相機)產生的;另一種情況是,影像是美術工作者在計算機上畫出來的。

對於前者,裝置採集到影像後,會對線性的影像進行Gamma編碼,即應用\(V_{encode} = V_{linear}^{\gamma}\)的冪函式關係對映。這裡,\(\gamma\)約等於0.45(\(1/2.2\))。此時,影像就儲存在sRGB空間中。

對於後者,當美術工作者在計算機上作圖時,並不是線上性空間中,而是在sRGB空間中。

Gamma工作流

儘管有這些好處,Gamma編碼還是在記錄和顯示影像的過程中,增加了一層複雜性。一個Gamma編碼的影像在螢幕上顯示時,必須有Gamma解碼,它被視為有效的轉換為原始場景的效果。換句話說,Gamma編碼的目的是記錄影像,而不是顯示影像。幸運的是,這第二步(“Gamma解碼”)是由顯示器和視訊卡自動執行。下圖說明了所有這些是如何組合在一起的:

  1. 影像\(\gamma\):當捕獲的影像轉換為標準的JPEG或TIFF檔案時,相機或原始開發軟體都會應用這種方法。它將相機的固有色調重新分配為更一致的色調,從而最有效地利用給定的位深度。
  2. 顯示\(\gamma\):這指的是你的顯示卡和顯示裝置的淨影響,所以它實際上可能是由幾個Gamma組成的。顯示\(\gamma\)的主要目的是補償檔案的Gamma,從而確保影像在螢幕上顯示時不會不真實地變亮。較高的顯示\(\gamma\)導致更黑暗的影像與更大的對比度。
  3. 系統\(\gamma\):這表示應用於影像的所有Gamma值的淨效果,也稱為“檢視Gamma”。為了忠實地再現場景,這應該接近於一條直線(Gamma = 1.0)。一條直線確保輸入(原始場景)與輸出(螢幕或列印中顯示的燈光)相同。然而,為了提高對比度,系統Gamma有時設定略大於1.0。這有助於彌補由於顯示裝置的動態範圍,或由於非理想的觀看條件和影像耀斑所造成的限制。

參考

相關文章