抽出した輪郭を画像加工に利用する(1)


DXライブラリでの画像加工その6.1。抽出した輪郭を加工に生かしてみます。

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

 

スポンサードリンク

前置き

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

前回、画像の輪郭をラプラシアンフィルタを用いて抽出しましたが。実際それを生かして画像の加工を行ってみたいと思います。(特に新しいギミック要素は)ないです。フィルタ処理のくだりはこちら

引き続き、実行用素材は以下のフリーのものをお借りしています。


*クリックで拡大

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

 

輪郭を強調してみようとした


*クリックで拡大

前回のフィルタ処理で抽出した輪郭画像は上図のように。しかしこちらの画像、輪郭と言いつつも細かい色の変わり方まで取り出してしまっていますね。

例えばこの状態で、『上の画像において、輝度が0でない(黒でない)座標の色を3倍にする』という処理を行った場合。本当の輪郭以外の部分も3倍処理され、画面がざらざらになってしまいます。


*クリックで拡大

実際に加工すると上図のように。何故か色鉛筆風(?)に変換されました(これはこれでありな気がしてきます)。プログラムにすると以下の通りに。なお、Cr配列が画面描写用、CD配列が元画像のデータ、CG配列がモノクロ変換時の画像の輝度です。

void get_outline(){
	int gOUT[3][3]={
		{-1,-1,-1},
		{-1, 8,-1},
		{-1,-1,-1}
	};
	for(int x=1;x<639;x++){
		for(int y=1;y<479;y++){
			Cr[x][y][0]=0;
			for(int dx=0;dx<3;dx++){
				for(int dy=0;dy<3;dy++){
					Cr[x][y][0]+=CG[x-1+dx][y-1+dy]*gOUT[dx][dy];
				}
			}
			if(Cr[x][y][0]<=0)Cr[x][y][0]=0;	
			Cr[x][y][1]=Cr[x][y][2]=Cr[x][y][0];
		
			for(int i=0;i<3;i++){
				if(Cr[x][y][i]==0)Cr[x][y][i]=CD[x][y][i];
				else Cr[x][y][i]=CD[x][y][i]*3;
			}
		}
	}
}

このようなざらざら化を避けるには、輪郭画像からあらかじめ細かい非輪郭部分を消しておく必要がありそうです。次回はフィルタを使用して、正しい輪郭部のみを強調できるようにしていきたいと。

ついでに、加工中の失敗例をもうひとつ。


*クリックで拡大

うっかり輪郭部だけ消してしまった例。まっくらい。

今回に限らず、『失敗したと思ったがこれはこれでありじゃね現象』はそこそこよく起こります。画像をいじくるだけで楽しめたりするので、暇つぶしにいかがでしょう。

スポンサードリンク