DXライブラリで画像のモザイク処理


DXライブラリでの画像加工その5。Mキーで画像のモザイク処理ができるようにします。

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

 

スポンサードリンク

前置き

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

今回の実行用素材は、下のフリーのものをお借りしました。カーネーション良き。余談ですが、リインカーネーションは転生を意味するそうで。厨学生に大人気。


*クリックで拡大

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

 

モザイク処理について

モザイク処理について軽く。財産権や個人情報保護などに用いられる、画像を荒くする処理です。可逆非可逆(元の画像に復元できるか否か)、大きく分けてこの2つの加工方法があります。可逆の場合は処理範囲をブロック分けしてパズルのように並べ替えることで、非可逆は処理範囲の色の平均をとることで加工しています。一般的なモザイク処理は非可逆で行われているので、今回のプログラムはそちらを採用。可逆処理が何に使われているかはちょっとここでは言えないので、google先生に聞いて、どうぞ。

加工の手順は、

  • 指定範囲内の色の平均値を求める
  • 指定範囲の色を↑で求めたものに変更する

という流れで行きます。

 

スポンサードリンク

モノクロ化機能の追加

それでは早速、変更機能を作成していきます。Fキーを入力すると画像にモザイク処理が施される、という仕組みで行きましょう。加工範囲は画面全体、モザイク1ブロックの大きさは define で指定できるような形で。ソースコードは、以下のものを貼り付ければOKであります。

#define MOSAIC 5 //(ソース先頭)

double mz[3];//(ローカル変数宣言部)

//モザイク処理(メインループ部)
if(ky[KEY_INPUT_M]==1){
	for(int x=0;x<640;x+=MOSAIC){
		for(int y=0;y<480;y+=MOSAIC){
			for(int i=0;i<3;i++){
				mz[i]=0;
				for(int j=0;j<MOSAIC;j++){
					for(int k=0;k<MOSAIC;k++){
						mz[i]+=Cr[x+j][y+k][i]/(MOSAIC*MOSAIC);
					}
				}
				for(int j=0;j<MOSAIC;j++){
					for(int k=0;k<MOSAIC;k++){
						Cr[x+j][y+k][i]=(int)mz[i];
					}
				}
			}
		}
	}
}


*クリックで拡大

ループ回数すげー。5重ループなんてエラいことになるもんですね。もう少し綺麗にソースを書けそうなものですが…

モザイクのサイズは5×5に指定。単純計算で元画像の25倍荒くなりました。何となく暗くなりすぎている気がしますので、ミスを発見したら直しておきます。


*クリックで拡大

define MOSAIC の値を変更すると、粗さを変えることが可能です。上画像は2×2。ぱっと見では元画像とあまり変わりませんな。


*クリックで拡大

使用色数の変更輝度調整を併用して行うとこのように。一気に旧ハード感が増しました。

スポンサードリンク