解説
HLS色空間のL(明度)を指定した範囲で変化させることでコントラストを調節する。実行例
以下のコードで処理を施した。_cImage2.AdjustContrast(50,200);

ソースコード
GDI+を利用した画像処理テストのスケルトン2を 元に拡張する。前に作成した「DnpImage.h」に2階調化関数を追加する。
class CDnpImage : public CDnpImageBase
,public CDnpImageConvolution
,public CDnpColorSpaceHLS
,public CDnpColorSpaceHSV
{
public:
//
// コントラスト調節
//
//HLS色空間のL(明度)を利用したコントラスト調節
//cbLow以下の値はL=0、cbHigh以上の値はL=HLSMAXにし、それ以外の値は
//cbLowとcbHighの傾きに応じて新しいL値に設定する
//
bool AdjustContrast(BYTE cbLow,BYTE cbHigh)
{
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;
double d;
BYTE pNew[256];
//新しい値への変換テーブルを作る
d = (double)HLSMAX / ((int)cbHigh - (int)cbLow);
for(y = 0; y < 256; y++)
{
nTmp = (long)(d * ((long)y - (long)cbLow));
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;
}
。。。。省略。。。。
};
