メディアプログラミング演習―第5回(第2テーマ1日目)― テーマ:領域埋めアルゴリズム(ペイント処理) 平面上の複雑な形をした領域を「塗りつぶす」アルゴリズムを扱う。 本実習で言う「領域」とは、「画像の中心を含む,黒色のピクセルが繋がってできてい る閉領域」を想定する.従って,この閉領域内の全てのピクセルを「黒」にするアルゴ リズムを稼働化するのがテーマその2である.例を示せば,以下の通りである. (a)領域の指定 (b) ペイント処理後 1.ペイント処理アルゴリズム 主として,以下の2つがある. (a) 領域内の任意の点の,近傍(4または8ピクセル)を調べ,ペイントされてい ないピクセルがあればそれを塗り,すべての点を塗りつぶすまで繰り返す方法. (b) 走査線ごとにペイント対象の領域の外であるか中であるかを判断し,内部のピ クセルを塗る方法. ここでは,(a)の方法を試みる.以下のステップを考える.まず.ピクセル T を考える. *ステップ1.真上のピクセル①から時計方向に「黒」のピクセル②を探す. *ステップ2.ステップ1の黒のピクセル②から,さらの時計方向に「白」③を探す. *ステップ3.ピクセル T を黒く塗り,ピクセル③をあらたなピクセル T とする. (a)ステップ1 (b)ステップ2 (c)ステップ3 *ステップ1からステップ3を,ステップ2での「白ピクセル」なくなるまで繰り返す 以下に,6回繰り返すまでの状況を示す. (a)3回繰り返し (b)数回の繰り返し(赤で示す) 2.プログラム *初期ピクセル T:「画像の中心は,領域内」との条件から, <<中心から,右(X のプラス)方向に黒のピクセルを探す>> int X=img_in.width/2; int y=img_in.height/2; while( Is_White(x,y)==1 ) { x=x+1;}; x=x‐1; *全体の流れ int id=1; while(id==1){ Set_Black(x,y); pos=Next_Black(x,y); pos=Next_White(x,y,pos); if( pos!=8 ) {x=Update_x(x,y,pos); y=Update_y(x,y,pos); } else { id=0;} } 関数の概要 ¾ 関数 Is_White(x,y): ピクセル(x,y)が白ならば「1」,そうでないなら「0」 ¾ 関数 Set_Black(x,y):ピクセル(x,y)を黒にする. ¾ 変数 pos: 方向コード・真上を「0」とし,時計方向8方向,「7」まで. 真下は「4」 . ¾ 関数 Next_Black(x,y): ピクセル(x,y)の真上から見て,時計方向の最初の「黒」 の方向コードを返す関数. ¾ 関数 Next_White(x,y,pos): ピクセル(x,y)の方向 pos から時計方向にみて, 最初に白ピクセルの方向コードを返す関数.なければ8を返す. ¾ 関数 Update_x(x,y,pos):ピクセル(x,y)の方向 POS にあるピクセルの x を返 す. ¾ 関数 Update_y(x,y,pos):ピクセル(x,y)の方向 POS にあるピクセルの y を返 す. ヒント:方向コードと実際のピクセル位置 Samnple6 中の d[8][2] で,方向コードpの位置は (x+d[p][0],y+d[p][1])と表現される. 今週と来週で,本プログラムを完成させ,問題点をさがし,その解決方法を探る. 来週は,プログラム完成とレポート(雛形は後日アップ)の完成を目指す.
© Copyright 2024 ExpyDoc