理解 Gamma

 關於Gamma的學習筆記。歡迎參觀、指導。。



1.        在哪見過、聽說過Gamma?
2.        什麼是Gamma?
2.1.        顯示器Gamma曲線
2.2.        檢查顯示系統的Gamma值
3.        什麼是Gamma校正?
4.        Gamma校正可能發生在哪裏
4.1.        系統級(硬件、操作系統)
4.2.        應用程序級
4.3.        文件級
5.        改變Gamma帶來的影響
5.1.        影調的變化
5.2.        顏色的變化
5.3.        其它
6.        校正Gamma的理由
6.1.        標準化及互換性
6.2.        算法上的要求
7.        不校正Gamma的理由
7.1.        現實的非標準化
7.2.        更符合視覺特性
7.3.        可能導致顏色數的減少
8.        結論



1.        在哪見過、聽說過Gamma?


*        還用說,Adobe Gamma
*        常聽說MAC的默認Gamma是1.8,PC的是2.2
*        我的顯卡驅動程序裏有Gamma調節
*        我下載了一個軟件,也可以調節顯示器的Gamma
*        WinDVD播放器帶Gamma校正功能
*        ACDSEE的曝光調節裏可以調Gamma
*        ACDSEE的選項中有Enable Gamma Correction
*        XV Viewer 能以參數-gamma 2.2 啓動(x window也可以)
*        PNG文件裏有Gamma校正
*        Photoshop裏當然也有
*        ICC Profile也和Gamma有關?
*        攝像頭、數碼相機、掃描儀?膠片?……中也有提到Gamma的
……

這些都是怎麼回事?


 
圖 1-1 顯卡(驅動程序)上的Gamma設置
現在很多顯卡上都有Gamma設置(圖中是一破爛集成顯卡)。


 
圖 1-2 ACDSEE中的曝光調節



2.        什麼是Gamma?


2.1.        顯示器Gamma曲線


Gamma可能源於CRT(顯示器/電視機)的響應曲線,即其亮度與輸入電壓的非線性關係。

圖 2-1 一典型顯示器 的響應曲線,非常接近指數函數
圖片來源:http://radsite.lbl.gov/radiance/refer/Notes/gamma.html
(說明:上圖中輸入值爲數字化的,即通常的RGB值,但可以理解數/模轉換是線性的,所以它和輸入電壓是等效的。)

歸一化後,我們通常可以用一簡單的函數來表示:

output = input ^ gamma

gamma就是指數函數中的冪

圖 2-2 歸一化的Gamma曲線
圖片來源:http://www.teamten.com/lawrence/graphics/gamma/

注意上圖曲線的一些特性:
*        端點是不變的,即不管gamma值如何變化,0對應的輸出始終是0,1的輸出始終是1(這一特性會被用到)。這可能是gamma又被叫作“灰度”係數的原因吧。
*        gamma > 1時,曲線在gamma=1斜線的下方;反之則在上方

另外說明一下,雖然是以顯示器作爲例子,但可擴展到一般的圖像相關的輸入/輸出設備。Gamma曲線應該是普遍存在的,即使它不是嚴格的指數關係,可能還是會這麼通稱。至少我知道的數碼機機/攝像頭裏的sensor也存在gamma曲線及gamma校正。


2.2.        檢查顯示系統的Gamma值


在PC上,好像還沒有什麼軟件方法可以得到系統的Gamma值(4.1會說明這一點)。有人做了一些圖片,可以粗略估計。其原理和Adobe Gamma類似。

圖 2-3 Gamma對照圖
圖片來源:http://radsite.lbl.gov/radiance/refer/Notes/gamma.html

另有一張類似的圖片:
http://www.teamten.com/lawrence/graphics/gamma/ramp.gif

使用方法:與Adobe Gamma類似,即眯着眼,或站遠點,或近視眼取下眼鏡,總之當左邊糊成一片,而右邊某欄的亮度和左邊相當時。

注意:如果您沒有做任何Gamma校正(沒有使用Adobe Gamma之類的軟件,或雖使用了但校正係數設爲1.0),測得的纔是顯示器的Gamma,否則只能稱爲系統Gamma(或複合Gamma)。

另外,通過顯示器自帶的ICC Profile是可以知道顯示器的Gamma的,這個應該比較準。我看了自己的G71f+,大約是2.2.



3.        什麼是Gamma校正?


從一個數字化的圖片文件,到我們最終看到的圖片,中間要經過許多環節。幾乎在任何一個環節上,都可以加入一些變換,以改變最終輸出和最初輸入的關係(類似的,這種關係被稱作系統Gamma或複合Gamma)。

比如,對gamma=2.5的顯示器,在數據傳遞到顯示器之前,將其做一個gamma=0.4的變換(比如對顯卡緩存中的數據,d’ = d ^ 0.4),這樣就能從總體上得到一個線性的關係。

注意這裏有一點混亂。通常我們說做一個gamma=c的校正,意思是指做output = input ^ (1/c)的變換。有一個倒數關係。

對於PC,顯示器的Gamma是2.2左右(可能以前更多的是2.5,現在好像趨向2.2了),一般沒有內置的校正,所以我們說Adobe Gamma對Windows系統默認的校正係數是2.2。對於MAC,顯示器的Gamma是2.5,硬件內置了1.4的校正,所以它還需要2.5/1.4~=1.8的校正才成爲線性的。下文對各種系統下的gamma校正過程有更詳細的說明。

http://www.cgsd.com/papers/gamma_diagram.html



4.        Gamma校正可能發生在哪裏


4.1.        系統級(硬件、操作系統)


顯示器內沒有聽說過有何補償,即使有,它們也對外呈現一定的gamma值。DVI接口的及LCD類顯示器不清楚。

主要的補償發生在顯卡及其驅動程序類。如果顯卡硬件不支持,則由驅動程序軟件完成。在Windows中,上層通過調用驅動程序的一個接口函數(DrvIcmSetDeviceGammaRamp)向其傳遞Gamma校正表(LUT),這個表的大小是3*256項(每項16字節),對應於RGB三個通道,每個通道256級。

描述這一細節,可以對有些事情更有把握:
*        這種校正實際上可以是任意函數,而不限於gamma爲冪的指數函數。
*        也是因爲此,不能通過驅動程序得到系統的gamma值(因爲最多隻能得到那個表)。
*        這一設置對整個系統有效(任何程序,任意顯示的圖片都受它影響)。

以前我一直不明白Adobe Gamma和驅動程序的Gamma是什麼關係,它們一起出現就不知所措。還有人說它們是共同作用的。現在我完全明白了,沒有迭加關係,最後者的設置有效。而且,Adobe Gamma也不必是(實際上也不是)一個駐留程序,它僅在啓動時將那個表傳給驅動程序就完成了它的任務。

還可以用其它程序來校正/設置gamma,下面是一個方便的小工具:Gamma Panel。(查看本文中的圖片,需要經常改變gamma,最好下一個,Free的。)

http://www.stars.benchmark.pl/in ... e6e44dea37584af9534


圖 4-1 Gamma Panel,一個校正系統Gamma的小工具
圖中的Gamma是校正係數,即實際曲線是:output = inupt ^ (1/gamma)


4.2.        應用程序級


如前提到的,某些播放軟件有Gamma校正功能,ACDSEE也有。這時,它們不是修改系統的Gamma校正表,而是在解碼時對當前幀/圖像作了實時的Gamma變換。


圖 4-2 ACDSEE瀏覽圖片時可加載Gamma校正功能
圖中左邊是由IE打開的同一圖片(無Gamma校正),可以看出它們的亮度不同。(不過,黑框和白邊是相同的。)


4.3.        文件級


如前面提到的(圖 1-2 ACDSEE中的曝光調節),某些圖像處理軟件可以調整文件的Gamma,這種調整的結果將寫入文件(即相當於對圖像進行某種處理)。比如,當你的PC未進行Gamma校正(你的系統Gamma=顯示器的Gamma約2.2),這時你可以把文件的Gamma調爲2.2保存,你以及其它未校正系統Gamma的PC用戶看到的這個圖片應是正好的。(注意,這裏有一個前提即原始圖片在Gamma=1的系統上看是“正好”的。)

另一種方式則是將Gamma校正的係數寫入文件內,而不改變文件內容,而瀏覽/處理軟件在解碼這一圖像時會依據這一參數對它單獨進行Gamma校正。(這被稱作“文件Gamma”。PNG格式支持)

總之,不管Gamma校正發生在哪一環節,它們是等效的(在理想情況下/或近似地看)。明白在哪些環節Gamma發生了怎樣的變化,然後做一些乘除法就可以了。



5.        改變Gamma帶來的影響


5.1.        影調的變化


通常的感覺是,系統gamma高,圖像會發暗,而校正後,畫面變亮

觀察下列圖片。

兩個對應的File Gamma=2.5的圖片是爲了模擬系統Gamma的變化。或者也可以用Gamma Panel之類的工具,將Gamma校正係數設爲1.0~2.5觀察(每組中的第1個圖片)。


圖 5-1 灰度圖0-128, File Gamma=1.0
圖片來源:http://www.cgsd.com/papers/palette2.html



圖 5-2 灰度圖0-128, File Gamma=2.5
圖片來源:http://www.cgsd.com/papers/palette2.html



圖 5-3 灰度圖128-255, File Gamma=1.0
圖片來源:http://www.cgsd.com/papers/palette.html



圖 5-4 灰度圖128-255, File Gamma=2.5
圖片來源:http://www.cgsd.com/papers/palette.html


結論:
*        當系統Gamma高(Gamma校正=1.0)時,看到的圖像暗部影調豐富;反之,則亮部豐富。
*        Gamma校正設爲2.5時看到的File Gamma=2.5的圖片,和校正設爲1.0時看到的File Gamma=1.0的圖片相當。


另:這裏有一個直觀的(用普通照片的)例子。
http://graphics.stanford.edu/gamma.html



5.2.        顏色的變化


很顯然,Gamma的變化帶來亮度的變化。而單獨改變某個通道的Gamma,則會則會帶來色調(Hue)的變化
http://www.cgsd.com/papers/gamma_colorspace.html

當然,如果顯示器本來就偏色,我們則可以改變某個通道的Gamma使其總體上保持均衡。


5.3.        其它


其它影響在後面有說明或提及。



6.        校正Gamma的理由


主要指是否要將系統Gamma校正到1.0。因爲校正總是存在的。(下同)


6.1.        標準化及互換性


如果數碼相機/掃描儀給你一個Gamma=1.0的圖片,你最好是在系統Gamma=1.0的系統上查看;或者當你的數碼圖片要拿去輸出時,對方系統Gamma=1.0;……

(這部分涉及到色彩空間、ICC Profile,我還不太清楚,而且接觸的設備非常有限,不多說了。)


6.2.        算法上的要求


在涉及不同灰度的混合時,就會對gamma有要求。一個簡單的例子,考慮在填充時,一半的黑(0)+一半的白(255),效果應該和50%的灰(128)相同。但這僅在系統gamma=1.0時成立。

又如,彩色轉黑白時常說的:30% R + 59% G + 11% B,也是針對gamma=1.0而言。

同樣,許多算法也是針對1.0的系統gamma,否則算法內要做gamma校正。

下面是一個抗距齒(anti-alias,反走樣)的例子。


圖 6-1 通常情況下的邊緣
圖片來源:http://www.teamten.com/lawrence/graphics/gamma/
由於只能在矩形的點陣中畫斜線,而斜線的像素值爲全黑,當斜線較陡(或平)時,就會有明顯的鋸齒感。


請將系統的gamma校正設爲1.0查看下面兩圖(即不校正系統gamma)


圖 6-2 採用anti-alias後,鋸齒感沒有那麼明顯了
圖片來源:http://www.teamten.com/lawrence/graphics/gamma/
在Photoshop中放大查看此圖片,就會發現邊緣不是全黑的,而是漸變的。(這是對anti-alias的直觀理解。)
注:不要用ACDSEE放大查看,它默認的放大算法是插值的,無法看清像素的原貌。



圖 6-3 anti-alias並gamma校正後,鋸齒感完全消失
圖片來源:http://www.teamten.com/lawrence/graphics/gamma/

當然,如果你保持系統gamma=1.0去查看上面的圖片,就會發現第2張圖完全無鋸齒感,第3張圖反而有一點。(這不是也可以作爲一種估計系統gamma的方法嗎)



7.        不校正Gamma的理由


7.1.        現實的非標準化


假定你的圖片作爲Web發佈,你的用戶(觀衆)的系統Gamma會是1.0嗎?即使可以假定色影無忌的泡菜會用Adobe Gamma將他們的系統Gamma校正到1.0左右,但絕大多數普通用戶呢?——在接觸到Photoshop前,我是不知道什麼Gamma的。

也許只能折衷吧。(MAC通過硬件只校正到1.8,SGI只校正到1.4,不知道有沒有這方面的原因。)

Making Good Cross Platform And WWW Pictures
http://www.cgsd.com/papers/gamma.web.html


而我們整天面對的操作系統,它默認用戶界面的設計,又是以什麼系統Gamma值爲前提的呢?——似乎設爲1.0並不是最舒服的。

PNG文件格式提供了Gamma補償的功能,但並沒有流行起來,因爲人們不知道他們的系統Gamma是多少(當然還有別的原因)。

The Sad Story of PNG Gamma “Correction”
http://www.hut.fi/u/hsivonen/png-gamma.html


7.2.        更符合視覺特性


就人的感知覺,心理量和物理量一般呈對數關係,視覺也不例外。雖然這個對數關係和那個指數關係並不嚴格對應,但方向上是一致的。即越暗處感覺越細(對同等光強的變化,暗處比亮處敏感),而對於(未校正的)顯示器gamma曲線(gamma值大於1),也是暗處對應的層次更多。

比如對gamma=2,以一半的光強爲分界,0~182對應於暗的一半,182~255對應於亮的一半。


7.3.        可能導致顏色數的減少


這是由於數字量的舍入誤差造成的。輸入數據按通常的每通道8位計算,當顯卡(DAC)精度只有8位時就會發生。

x = 0:255; y = uint8((x / 255) .^ gamma * 255); n = histc(y, x); count = sum(n>0)

當gamma=2(或0.5)時,結果count=192,即256色變爲了192色。若三通道Gamma值(校正系統)相同,則總共的顏色數爲192^3 = 707,788色,而24位色原本爲16,777,216。

當然,對10bit, 12bit及更高位顯卡就不存在這個問題了。(以前一直不明白在8bit色彩的系統上,更高位的顯卡有何意義。現在有一點感受了。)



8.        結論


Gamma是一個基本的要素。關心圖形、圖像的人應該給它一點關心。

不將顯示系統Gamma校正到1.0似乎並沒有太大的錯誤,至少你和人民大衆站在了一邊。校正到什麼程度,既有折衷的考慮,也有口味的因素。但不偏色是必要的。當標準需要你校正時,你最好遵守標準。總之,取決於你的圖片與誰“接口”。

Gamma只是ICC Profile的一部分。關於標準及互換性的問題,也許只有理解了色彩管理以後,才能完全明白。

較瘦 編輯於 2003-10-22 13:13

----

注:

假定你的圖片作爲Web發佈,你的用戶(觀衆)的系統Gamma會是1.0嗎?即使可以假定色影無忌的泡菜會用Adobe Gamma將他們的系統Gamma校正到1.0左右,但絕大多數普通用戶呢?



這段話中有錯誤,用Adobe Gamma是將系統Gamma校正到2.2(PC用戶)或1.8(MAC用戶)等。由於我當初有這種理解(認爲校正是應將系統Gamma校正到1.0),導致一些偏差,請各位小心!估計不影響全局,我也就不一一修正了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章