Just a Computer Graphics Studio & My Life

伽瑪校正 (Gamma Correction)

當初聽到伽瑪(Gamma),第一個念頭是gamma一定是高科技時代的技術,沒想到看了前輩寫的文章後,才知道gamma是舊時代的產物。話說由於早期CRT螢幕輸入單位電壓並不會產生等量的亮度(所以是非線性),為了正確地顯示畫面顏色亮度,刻意制定一個曲線關係(x軸為輸入與y軸為輸出),讓最終輸出的影像為線性顏色亮度的影像。即使現代能夠製造出線性反應的液晶螢幕,這種現象仍然深深地影響影像處理,不管是後製、合成、調色或是3D算圖渲染都離不開gamma這個技術。可以參考我先前整理的伽瑪 (Gamma)

我們人接受外界的資訊,視覺佔了所有感官一半以上,Gamma這個概念(技術)最好能夠瞭解!無論是輸入還是輸出或是介於其中,Gamma已經深入在我們眼前,過去使用CRT螢幕,現在使用LCD螢幕,它們的差異為何?為什麼Mac要使用Gamma 1.8,而PC要使用Gamma 2.2呢?為什麼做設計的人比較偏好蘋果系列電腦?

Gamma的定義

Gamma是一個描述階調(tone)特性的對數。字典裡定義Gamma為一個數,指示影像明暗的對比等級,它可以是一條直線。一個更好對Gamma的描述是非線性指數函式,這個函式是以兩個變數來定義:f(x) = x^γ。在以上兩者狀況,Gamma描述一條線性曲線或是在對數尺度的一條直線。

伽瑪校正(Gamma correction)是個常被誤解的觀念。簡單來說,伽瑪描述了相機或螢幕的非線性(nonlinear)反應的現象。當一個相機接收到兩倍的光強時,相機並不會把這個資料存成兩倍的RGB值。有很多原因是為什麼相機的記錄系統會有這種記錄方式,這種現象稱為伽瑪(Gamma)。其中一個原因是顯示器感光本身的問題,例如底片具有非線性的感光曲線,另外CRT螢幕也有同樣問題:像素的光亮強度輸入的電壓強度並不是呈現線性關係。

另外一個原因,因為人眼對於黑暗中的細節比明亮中的細節還要更敏感(人眼的感光曲線其實是對數曲線,稱為Weber-Fechner定律),所以人眼視覺是以非線性的方式來記錄訊號。而現代液晶顯示器(Thin film transistor liquid crystal display (TFT-LCD))本身雖然沒有先天上的伽瑪問題,但是為了要迎合傳統的工作流程,TFT-LCD螢幕會刻意模擬出伽瑪的效果。

註:Weber – Fechner定律敘述主觀感覺與刺激強度的對數成正比關係,意即當人體感官所接收到的感覺以算術級數增加時,外界刺激強度需要以更大的幾何級數增加,人們才能感覺其差異。該定律能以下式表示:S=K×log(I/I0),S為感覺大小,I/I0為物理強度變化比值,K為一比例數。

#伽瑪的基本觀念(Gamma 101)

  1. 所有的螢幕都有非線性的輸出輸入反應,這是故意的。
  2. 大多數的2D軟體都會以線性的顏色模型來處理,所以它假定,255數值的亮度是128數值的兩倍。但由於顯示器對於訊號的輸出輸入是非線性的,所以產生的亮度會是不正確的。事實上,大多數螢幕(gamma=2.2),如果你想要顯示出255數值亮度的50%亮度的話 那你就必須要輸入(0.5 ^(1/2.2))* 255 = 186的數值。如果你不考慮gamma的問題 輸入128數值 就只會產生大約(128/255)^ 2.2 = 22%的亮度。
  3. 數位相機基本上具有線性的輸出入效果,但因為通常我們會在電腦螢幕上面看拍出來的照片,所以數位相機會故意在照片裡面嵌入gamma。(所以。JPG格式是帶有gamma的,但是RAW的格式是線性資料,當你把RAW檔轉成JPG格式時就會產生非線性的照片了)
  4. 因此,如果你用2D軟體去開你照片拍出的jpg圖檔時,您必須要把gamma補償回來(去gamma)。
  5. 如果你的圖片是在2D軟體產生的(基本上這張圖是線性的),當你把這張照片顯示在帶伽瑪的螢幕 你也要做gamma補償。

#更多關於伽瑪

  1. Gamma不是bug,它是一個功能,因為人的眼睛對光線的亮度具有非線性的感光反應。如果你每個顏色只有8 bit來記錄顏色資料,很重要地利用這8 bit正確地重現人眼的感光效果很重要,它必須要是非線性的編碼方式。即使是新一點的螢幕仍然有伽瑪:通常顯示卡會用8 bit來處理每種顏色避免色帶問題,這8 bit必須每個強度看起來間距是等距的。製造螢幕的廠商有能力生產線性反應曲線的螢幕,但如果你用8 bit來顯示圖片,效果會很糟糕。
  2. 現今大多數電腦螢幕都以sRGB (standard RGB)的標準來顯示,也就是伽馬2.2。
  3. 大多數的數位相機也以sRGB紀錄相片。如果是掃描進來的圖或是合成圖像就不會帶有伽馬2.2。
  4. 幾乎所有的浮點紀錄HDR資料是線性的,即與伽瑪為1.0。
  5. 對於圖片而言,「伽馬」代表了強度是如何被記錄的。換句話說:圖檔的gamma是為了要讓圖片在螢幕上能正確地顯示出來。
  6. 有些圖片會帶有gamma的標籤,但這是不可靠的,因為很多繪圖軟體會忽略這個標籤。因此,要正確知道圖檔的gamma數值並不容易。
  7. 如果您的螢幕有2.2的伽瑪而顯示的圖片看起來有很正常,那該圖片可能本身就帶有伽瑪2.2。

#伽瑪常被誤解的觀念

  1. 錯誤觀念:我已經校正螢幕了,所以我不需要管gamma!
    錯。當你校正完螢幕,代表你校準到標準的sRGB曲線,通常會是伽瑪2.2。當你的螢幕做過校正,這表示你的所有圖檔都必須要做伽瑪2.2的補償。
  2. 錯誤觀念:我的數位相機會記錄「線性」的照片!
    有可能,你如果是用RAW檔來存檔的話,它的格式是線性沒有錯。然而當你把RAW檔轉成JPG格式時,影像就會自動套用gamma,通常這個數值是2.2。

參考:

Advertisements

Comments on: "伽瑪校正 (Gamma Correction)" (11)

  1. 非常感谢,明白了不少。少了不少文章,中文的解释就这个最详细了。想了解下,还有什么书可以让我更加深入了解这方面的知识呢?我是做办公软件的软件工程师。

    喜歡

    • 關於伽馬,我幾乎都在網路上查找資料,或是在攝影相關書籍上認識喔!

      很高興有大陸的朋友來留言~謝謝你的讚賞! 😀

      辦公軟件需要用到伽馬的概念?感覺很有趣!而我是作iOS App的工程師,因為所做即所見讓我很有成就感,而且可以馬上給他人使用。

      可以加我QQ:2483327313@qq.com

      喜歡

  2. 很詳細的解說!
    感謝大大無私的分享^^!!!
    謝謝您!
    祝您新年快樂!

    喜歡

  3. 很清楚的講解,謝謝您。

    喜歡

  4. 謝謝你
    你的文章用字很口語(順暢台灣腔)
    因為受到這篇文章的幫助
    所以我要寫一點回應給你掌聲

    喜歡

  5. […] Gamma 校正 :色管的重要程序之一,這篇寫的詳細(有些我還是不太瞭解就是了…),作者有另外介紹Gamma是什麼(Link here) […]

    喜歡

  6. 您好,想請問您如果使用MATLAB將一個數值介於0~255之間的矩陣用imwrite存成一張bmp的圖,那麼請問這種圖也會有gamma嗎? 如果有那gamma值為多少呢?

    (因為我使用MATLAB將矩陣存成bmp和jpg然後再將圖片用imread讀回MATLAB中查看矩陣的數值,發現還是在0~255之間,這是否代表用此軟體儲存一個資訊成圖片並沒有gamma呢?)

    謝謝您耐心看完這個問題。

    喜歡

    • 這可能需要去瞭解BMP檔裡紀錄的資訊,我想應該有特別的軟體可以讀取gamma值,不過影像通常不會紀錄gamma值,因為我喜歡攝影,看到影像紀錄相當多資料,卻還沒看過gamma值。
      你所看到的陣列值,其實是RGB的值(三個值都介於0-255),它並不能讓你知道gamma值是多少喔!

      喜歡

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: