DXライブラリで画像をモノクロに変更


DXライブラリでの画像加工その3。Gキーで画像をモノクロに変更できるようにします。

所要時間は5分くらいです。

 

スポンサードリンク

前置き

DXライブラリを用いて画像加工ソフトを作成していきます。初期設定はこちらから、キー入力に関してはこちらからどうぞ。

今回の実行用素材は、下のフリーのものをお借りしました。やらなければいけないことすべてを投げ出して海に行きたい。


*クリックで拡大

前回同様画像名はtest、サイズは 640×480 、形式は bmp です。

 

モノクロ描写の仕組み

今回は画像を白黒化、所謂モノクロに加工していく訳でありますが。実際に画像を編集する前に、モノクロの仕組みについて。DrawPixelを用いて描写する場合は、RGBの値を全て等しくすることで、赤緑青のどれにも偏らない光を作ることができます。例えば、(255,255,255)なら真っ白、(40,40,40)なら限りなく黒に近い何か、といった風になります。


*クリックで拡大

その為、加工の手順は

  • 現在のCrの値(RGB)から、モノクロ後の光の強さを決定する
  • Crの値(RGB)を全て、↑で決定した値に更新する

という流れになりますね。

 

スポンサードリンク

モノクロ化機能の追加

それでは早速、変更機能を作成していきます。Gキーを入力すると画像が白黒になる、という仕組みで行きましょう。

今回は単純に、モノクロ後の光の強さ=RGBの強さの合計÷3で実行してみます。ソースコードは、以下のものをメインループ下に貼り付ければOKであります。

//グレーに
if(ky[KEY_INPUT_G]==1){
	for(int x=0;x<640;x++){
		for(int y=0;y<480;y++){
			Cr[x][y][0]=(Cr[x][y][0]+Cr[x][y][1]+Cr[x][y][2])/3;
			Cr[x][y][1]=Cr[x][y][2]=Cr[x][y][0];
		}
	}
}


*クリックで拡大

無事にそれっぽい画像になりました。悪くはないですね。

因みに、モノクロ変換の式は非常に多くの種類があるようでして。単純にRGBを3で割るよりも効果的な方法も沢山存在します。例として挙げてみると、

Cr[x][y][0]=(Cr[x][y][0]*0.3+Cr[x][y][1]*0.59+Cr[x][y][2]*0.11);

こちらの式が使われることが多いようです(厳密には 0.299xR+0.587xG+0.114xB )。なんでも、心理物理量とやらを考慮して、G重め、Rもそこそこ重めにとるのだとか。こちらの方法で変換した結果は↓の画像ですね。


*クリックで拡大

正直、違い分からんです。

 

蛇足:海なんですよ。

せっかくきれいな海の画像だったので、青い色は残したいなと思いまして。青の光だけグレー処理を外し、光を強めてみました。その結果↓


*クリックで拡大

海が消えた。えー。緑の美しい海だったため、青だけ残しても然程意味はなかったのですね。一応そちらの処理も貼っておきます。

if(ky[KEY_INPUT_G]==1){
	for(int x=0;x<640;x++){
		for(int y=0;y<480;y++){
			Cr[x][y][0]=(Cr[x][y][0]*0.3+Cr[x][y][1]*0.59+Cr[x][y][2]*0.11);
			Cr[x][y][1]=Cr[x][y][0];
			Cr[x][y][2]*=1.5;
		}
	}
}

色は奥が深いなー、なんて訳の分からないことを書いて、この辺で失礼いたします。

スポンサードリンク