解説
HLS色空間のL(明度)をガンマ値で変化させることでガンマ補正する。実行例
以下のコードで処理を施した。_cImage2.AdjustGamma(1.5);

ソースコード
GDI+を利用した画像処理テストのスケルトン2を 元に拡張する。前に作成した「DnpImage.h」に2階調化関数を追加する。
#include "math.h"
class CDnpImage : public CDnpImageBase
,public CDnpImageConvolution
,public CDnpColorSpaceHLS
,public CDnpColorSpaceHSV
{
public:
//
// ガンマ補正
//
//HLS色空間のL(明度)を利用したガンマ補正
//
bool AdjustGamma(double dR)
{
if(IsValidImage() == false)
return false;
int nStrideBytes;
bool ret;
UINT x;
UINT y;
UINT nWidth;
UINT nHeight;
BYTE* pData;
RGBTRIPLE* pRGB;
nWidth = GetWidth();
nHeight = GetHeight();
ret = LockBits(&pData,&nStrideBytes);
if(ret == false)
return false;
long nTmp;
BYTE pNew[256];
//新しい値への変換テーブルを作る
dR = 1.0 / dR;
for(y = 0; y < 256; y++)
{
nTmp = (long)(HLSMAX * pow((double)y / HLSMAX,dR));
if(nTmp > HLSMAX)
nTmp = HLSMAX;
if(nTmp < 0)
nTmp = 0;
pNew[y] = (BYTE)nTmp;
}
for(y = 0; y < nHeight; y++)
{
pRGB = (RGBTRIPLE*)pData;
for(x = 0; x < nWidth; x++)
{
int H;
int L;
int S;
RGBtoHLS(pRGB[x],H,L,S);
//処理はL(明度)のみ
L = pNew[L];
HLStoRGB(H,L,S,pRGB[x]);
}
pData += nStrideBytes;
}
UnlockBits();
return true;
}
。。。。省略。。。。
};
