Gamma矯正技術

Gamma矯正技術

一. gamma校正背景

在電視和圖形監視器中,顯像管發生的電子束及其生成的圖像亮度並不是隨顯像管的輸入電壓線性變化,電子流與輸入電壓相比是按照指數曲線變化的,輸入電壓的指數要大於電子束的指數。這說明暗區的信號要比實際情況更暗,而亮區要比實際情況更高。所以,要重現攝像機拍攝的畫面,電視和監視器必須進行伽瑪補償。這種伽瑪校正也可以由攝像機完成。我們對整個電視系統進行伽瑪補償的目的,是使攝像機根據入射光亮度與顯像管的亮度對稱而產生的輸出信號,所以應對圖像信號引入一個相反的非線性失真,即與電視系統的伽瑪曲線對應的攝像機伽瑪曲線,它的值應爲1/γ,我們稱爲攝像機的伽瑪值。電視系統的伽瑪值約爲2.2,所以電視系統的攝像機非線性補償伽瑪值爲0.45。彩色顯像管的伽瑪值爲2.8,它的圖像信號校正指數應爲1/2.8=0.35,但由於顯像管內外雜散光的影響,重現圖像的對比度和飽和度均有所降低,所以彩色攝像機的伽瑪值仍多采用0.45。在實際應用中,我們可以根據實際情況在一定範圍內調整伽瑪值,以獲得最佳效果。
在這裏插入圖片描述

圖1
圖2中左圖爲原圖,中圖爲gamma = 1/2.2在校正結果,原圖中左半側的灰度值較高,右半側的灰度值較低,經過gamma = 1/2.2校正後(中圖),左側的對比度降低(見鬍鬚),右側在對比度提高(明顯可以看清面容),同時圖像在的整體灰度值提高。

右圖爲gamma = 2.2在校正結果,校正後,左側的對比度提高(見鬍鬚),右側在對比度降低(面容更不清楚了),同時圖像在的整體灰度值降低。

值得一提的是,人眼是按照gamma < 1的曲線對輸入圖像進行處理的。

Gamma曲線是一種特殊的色調曲線,當Gamma值等於1的時候,曲線爲與座標軸成45°的直線,這個時候表示輸入和輸出密度相同。高於1的Gamma值將會造成輸出亮化,低於1的Gamma值將會造成輸出暗化。總之,我們的要求是輸入和輸出比率儘可能地接近於1。在顯示器、掃描儀、打印機等輸入、輸出設備中這是一個相當常見並且比較重要的概念。在計算機系統中,由於顯卡或者顯示器的原因會出現實際輸出的圖像在亮度上有偏差,而Gamma曲線矯正就是通過一定的方法來矯正圖像的這種偏差的方法。一般情況下,當用於Gamma矯正的值大於1時,圖像的高光部分被壓縮而暗調部分被擴展,當Gamma矯正的值小於1時,圖像的高光部分被擴展而暗調部分被壓縮,Gamma矯正一般用於平滑的擴展暗調的細節。
在這裏插入圖片描述

二.gamma校正定義

(Gamma Correction,伽瑪校正):所謂伽瑪校正就是對圖像的伽瑪曲線進行編輯,以對圖像進行非線性色調編輯的方法,檢出圖像信號中的深色部分和淺色部分,並使兩者比例增大,從而提高圖像對比度效果。計算機繪圖領域慣以此屏幕輸出電壓與對應亮度的轉換關係曲線,稱爲伽瑪曲線(Gamma Curve)。

以傳統CRT(Cathode Ray Tube)屏幕的特性而言,該曲線通常是一個乘冪函數,Y=(X+e)γ,其中,Y爲亮度、X爲輸出電壓、e爲補償係數、乘冪值(γ)爲伽瑪值,改變乘冪 值(γ)的大小,就能改變CRT的伽瑪曲線。典型的Gamma值是0.45,它會使CRT的影像亮度呈現線性。使用CRT的電視機等顯示器屏幕,由於對於 輸入信號的發光灰度,不是線性函數,而是指數函數,因此必需校正。
在這裏插入圖片描述

三.gamma校正原理

假設圖像中有一個像素,值是200,那麼對這個像素進行校正必須執行如下步驟:

  1. 歸一化:

將像素值轉換爲0~1之間的實數。算法下:

(i+0.5)/256

這裏包含1個除法和1個加法操作。

對於像素A而言,其對應的歸一化值爲0.783203。

2.預補償:

根據公式,求出像素歸一化後的數據以1/gamma爲指數的對應值。這一步包含一個求指數運算。若gamma值爲2.2,則1/gamma爲0.454545,對歸一化後的A值進行預補償的結果就是0.783203^0.454545=0.894872。

3.反歸一化:

將經過預補償的實數值反變換爲0~255之間的整數值。具體算法爲:f*256-0.5此步驟包含一個乘法和一個減法運算。續前例,將A的預補償結果0.894872代入上式,得到A預補償後對應的像素值爲228,這個228就是最後送入顯示器的數據。

如上所述如果直接按公式編程的話,假設圖像的分辨率爲800*600,對它進行gamma校正,需要執行48萬個浮點數乘法、除法和指數運算。效率太低,根本達不到實時的效果。

針對上述情況,提出了一種快速算法,如果能夠確知圖像的像素取值範圍,例如,0~255之間的整數,則圖像中任何一個像素值只能是0到255這256個整數中的某一個;在gamma值已知的情況下,0~255之間的任一整數,經過“歸一化、預補償、反歸一化”操作後,所對應的結果是唯一的,並且也落在0~255這個範圍內。

如前例,已知gamma值爲2.2,像素A的原始值是200,就可求得經gamma校正後A對應的預補償值爲228。基於上述原理,我們只需爲0~255之間的每個整數執行一次預補償操作,將其對應的預補償值存入一個預先建立的gamma校正查找表(LUT:LookUpTable),就可以使用該表對任何像素值在0~255之間的圖像進行gamma校正。

四.gamma校正實現

1 #include <math.h>

2

3 typedef unsigned char UNIT8; //用 8 位無符號數表示 0~255 之間的整數

4 UNIT8 g_GammaLUT[256];//全局數組:包含256個元素的gamma校正查找表

5 //Buildtable()函數對0-255執行如下操作:

6 //①歸一化、預補償、反歸一化;

7 //②將結果存入 gamma 查找表。

8 //從公式得fPrecompensation=1/gamma

9 void BuildTable(float
fPrecompensation )

10 {

11 int i;

12 float f;

13 for( i=0;i<256;i++)

14 {

15 f=(i+0.5F)/256;//歸一化

16 f=(float)pow(f,fPrecompensation);

17
g_GammaLUT[i]=(UNIT8)(f*256-0.5F);//反歸一化

18 }

19 }

20

21

void
GammaCorrectiom(UNIT8 src[],int iWidth,int iHeight,float
fGamma,UNIT8 Dst[])

22 {

23 int iCols,iRows;

24 BuildTable(1/fGamma);//gamma校正查找表初始化

25 //對圖像的每個像素進行查找表矯正

26 for(iRows=0;iRows<iHeight;iRows++)

27 {

28 for(iCols=0;iCols<iWidth;iCols++)

29 {

30
Dst[iRowsiWidth+iCols]=g_GammaLUT[src[iRowsiWidth+iCols]];

31 }

32 }

33 }

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