了解Gamma Correction

Gamma 在數位影像系統裡面是個重要的議題,但卻很少提到。Gamma 定義了像素的數值與真實的亮度值之間的關係。如果沒有 gamma 存在,我們將無法感知畫面較暗的訊息,而相關的 gamma 非線性運算可稱為 Gamma CorrectionGamma Encoding 或是 Gamma Compression

● Gamma 存在到底有甚麼用呢?

1.我們人眼對光的敏感度是非線性的,但相機卻是線性的。

數位相機上的感光元件,感測到的光亮度是線性關係( 以8 bits depth 為例,表示像素128是255的一半亮度);但人類的眼睛感知上卻不是如此簡單,當我們需要感知255一半的亮度時,卻只要像素約50就夠了,所以人眼對於光的感知能力是非線性的。2016-02-24_171725< 相機擷取到50%強度的亮度。>

2016-02-24_171744

<人眼感測到50%強度的亮度。>

所以跟相機相比,我們人眼對於暗部的感知能力比亮部還要來的敏銳。那跟本篇要說的 Gamma 有甚麼關係呢?因為數位相機的『線性關係』與人類眼睛的『非線性關係』溝不上邊,因此 Gamma 是將數位相機的線性關係轉換成非線性關係,這個步驟就叫做 Gamma Correction 或是 Gamma Encoded。

2. Gamma encoded 在儲存的過程中被實現。

在任何數位圖檔( ex JPEG,除了 RAW檔案外;video files 也是一樣,ex MPEG )儲存的 binary data 都會明確的經過 Gamma encoded,而不是線性的像素值,Gamma encoded 使影像畫素重新分布為我們人眼較能感知的分布,以下圖 5bit depth 為例,經由 Gamma Encoded 後,灰階分布較為一致。

2016-02-24_173344

< 線性 Encoded 與 Gamma Encoded 比較>

● Gamma 工作流程

Gamma 的非線性關係除了與人眼感知有關係之外,還跟 monitor 特性有關。早期 CRT (Cathode ray tube) 螢幕由於輸出電流與輸入的電壓不成線性關係(以8bit depth為例,如果要輸出白色(255)的一半亮度,像素值要為178左右,而非128),所以影像在儲存時要做 Gamma Correction,然後在 display 端才能正確地顯示數值。

I\propto V_{s}^{\gamma }

\gamma 影響亮度與電壓之間的關係,在 CRT 時代 \gamma 範圍在 2.35~2.55 之間;但現在 LCD 螢幕或電視所校正的 \gamma 範圍在 1.8~2.2 之間。Windows 的電腦 image encoding gamma 是 1/2.2,而 decoding gamma 是 2.2;反之 Apple Mac 裡預設的 encoding gamma 是 1/1.8,而 decoding gamma 是 1.8。但是現在的螢幕可調性很高,gamma value 是可以自行校正的。

2016-02-24_180000

上圖說明了原本是線性的 RAW image 經過了 Image File GammaDisplay Gamma 後,所得到的 System Gamma 會還原成線性分布。

1.Image File Gamma

2016-02-24_181027

上圖左邊是 RAW 影像,他的 image gamma 是 1.0,左邊的 encoding gamma 為 1/2.2,在大部分的影像檔案裡所用的 encoding gamma 都為 1/2.2 (只要是使用 sRGB 和 Adobe RGB color space)。

2.Display Gamma

display gamma 是可以掌控的,我們可以藉由 monitor calibration 去校正我們想要的對比程度。下圖可以看到透過不同 display gamma 值的調整,可以得到不一樣的影像結果。

2016-02-24_182616

CRT Monitors 由於自己電壓電流不成正比的特性,有著像 gamma 2.5 的 Display Gamma,幾乎是我們人眼感測能力的反轉換,所以只要透過製造商做些微的調整就可以達到 Display Gamma 2.2 的結果了。

LCD Monitors 本身液晶明亮度與輸入像素大小成正比,所以需要經過特殊的 gamma look-up table 去做校正,來逼近 Display Gamma 2.2 的效果。

 

 


reference :

http://www.cambridgeincolour.com/tutorials/gamma-correction.htm

https://en.wikipedia.org/wiki/Gamma_correction

 

6 thoughts on “了解Gamma Correction”

  1. 你好, 首先感謝你分享這個文章, 很有幫助!
    但是這邊有一些問題不太清楚所以不知道可不可以請教您
    在前面的部分你有提到, 圖檔都會經過gamma encoded的處理, 而不是線性的像素值,使影像畫素重新分布為我們人眼較能感知的分布(非線性), 但是我想請問既然影像已經變成我們人眼較能感知的分布, 為何顯示器在顯示的時候還要再經過一次display gamma的處理呢? 如此一來的話像素值的分布不就又回到線性的情況了嗎?

    1. 不用客氣,
      由於螢幕輸出電流與輸入的電壓不成線性關係,所以會需要一個display gamma。
      你只要想說人眼對暗部比較敏感,需要一個下弦的 curve 修正;
      反之螢幕特性需要一個上弦的 curve 修正。
      一上一下剛好抵銷,就所謂 Net Effect。

      1. 抱歉, 謝謝你的回答 , 我可能表達得不太清楚
        我的意思是, 因為人眼對暗部比較敏感, 所以利用一個下弦的gamma curve去修正原本是線性的曲線後
        等於目前的狀態下是適合人眼看的;
        但是在顯示器上顯示之前, 又會再經過一個 display gamma(上弦)修正
        如此一來曲線不就又變回人類不適合觀看的線性曲線了嗎?

        我認知的FLOW如下:

        (人眼不適合) (人眼適合) (人眼不適合)
        線性曲線 ------> 非線性曲線 ------> 線性曲線
        (下弦修正) (上弦修正)

        再次感謝您的回答!

  2. SORRY格式跑掉,大概是這樣
    flow:
    (人眼不適合)______(人眼適合)______ (人眼不適合)
    線性曲線 --------> 非線性曲線 -------> 線性曲線
    ______(下弦修正)_______ (上弦修正)_____

    1. 我懂你的問題,我舉個例子,如果要輸出白光一半的亮度,8bit為例,像素值就是128。
      但人眼對光的敏感度是非線性的關係,原始亮度128的像素值,經過下弦修正後就會變成178(實際上會比白光一半亮度還亮),此刻為非線性。
      此時你有了非線性的數值,但這非線性的數值不是直接將下弦修正後的178直接讓螢幕顯示,就會顯示白光一半的亮度,因為螢幕也有非線性的特性,那他剛好與人眼相反,他必須經過上弦修正。
      所以呢,將178(非線性)經過上弦修正變成128(線性),如此一來,我們在螢幕上顯示的像素值就是白光的一半。
      總結 : 感光元件(線性) >> 人眼gamma(非線性) >> 螢幕顯示display gamma(線性)
      經過一上一下弦的轉換曲線修正後,我們感知到的亮度會與我們得到的像素值相同。

Leave a Reply

Your email address will not be published. Required fields are marked *