画像のコントラスト調節

解説

 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;
	}


	。。。。省略。。。。

};

カテゴリー「VC++ TIPS」 のエントリー