画像は、画素Xを有し、値100は、次に、画素Xの補正は、次のステップであると仮定する。
1.正規:0と1の間の実数に画素値を変換します。アルゴリズムは以下の通りである:(X + 0.5)/ 256ここで、分割及び加算演算を含みます。画素X、0.392528の対応する正規化された値のために。
2.事前補償:式に従って、インデックスに対応する1 /ガンマ値に正規化画素データを取得します。このステップでは、要求累乗を含んでいます。2.2のガンマ値、1 /ガンマが0.454545である場合、X値の結果は、プレ補償^ 0.392528 0.454545 = 0.653764のに正規化。
3.抗正規化:実数値逆変換事前補償スルーは、0と255の間の整数値です。特定のアルゴリズム:F * 256 - 0.5このステップは、減算および乗算を含みます。続きの実施形態では、上記の式にX 0.653764の結果の事前補償は、対応するX 167事前補償画素値を与えるために、ディスプレイ167は、データを送信する最後のものです。
アルゴリズム:控訴運用効率は、このような状況のため、高速なルックアップテーブル(ルックアップテーブルLUT)は比較的低いです。変換前と後に提供される、Xの値が0と255の間です。
このアルゴリズムは、低ビットビットビットに高には適用されません、同じ原理、見積もりに異なる式は適していませんか?検討するために、
#include <math.h>
typedef unsigned char UNIT8; // 0~255
UNIT8 g_GammaLUT[256];
// fPrecompensation = 1 / gamma
void BuildLUTTable(float fPrecompensation )
{
int i;
float f;
for( i=0;i<256;i++)
{
f=(i+0.5F)/256;//归一化
f=(float)pow(f,fPrecompensation); //预补偿
g_GammaLUT[i]=(UNIT8)(f*256-0.5F);//反归一化 & 结果存入 g_GammaLUT
}
}
void GammaCorrectiom(UNIT8 src[],int iWidth,int iHeight,float fGamma,UNIT8 Dst[])
{
int iCols,iRows;
BuildLUTTable(1/fGamma);//gamma校正查找表初始化
//查找表矫正
for(iRows=0;iRows<iHeight;iRows++)
{
for(iCols=0;iCols<iWidth;iCols++)
{
Dst[iRows*iWidth+iCols]=g_GammaLUT[src[iRows*iWidth+iCols]];
}
}
}
typedefをunsigned char型単位8。// 0〜255
単位8 g_GammaLUT [256]。
// fPrecompensation = 1 /ガンマ
空BuildLUTTable(フロートfPrecompensation)
{
私はint型。
フロートF;
以下のための式(I = 0、I <256; I ++)
{
F =(I + 0.5F)/ 256; //正規化
F =(FLOAT)POW(F、fPrecompensation); //事前補償
g_GammaLUT [I] =(単位8)(F * 256-0.5F); //&非正規化結果g_GammaLUTに格納
}
}
空GammaCorrectiom(単位8のSRC []、int型IWIDTH、int型IHEIGHT、フロートfGamma、単位8 Dstの[])
{
int型iCols、iRows。
BuildLUTTable(1 / fGamma); //ガンマ補正ルックアップテーブルを初期化
//補正ルックアップテーブル
(iRows ++; iRows <IHEIGHT iRows = 0)のための
{
(; iCols <IWIDTH; iCols ++ iCols = 0)のための
{
DST [iRows * IWIDTH + iCols] = g_GammaLUT [SRC [iRows * IWIDTH + iCols]。
}
}
}