2009年8月16日日曜日

画像処理 #22 細線化

本日は,2値化画像の細線化.

最近では電車内でもやってる人を見ますね.脳トレの一種でしょうか.



では,その手法を….

まず,黒画素=1,白画素=0とします.
全画素に対して,ラスタスキャン(つまるところ,1ピクセルずつ見ていくわけです)を行い,注目画素中心に,3x3の範囲を観察し,以下の条件を満たした時,その画素を白画素にします.
1.境界上にある黒画素である.
2.白画素に変更しても,連結性が保たれる.
3.端点で無い.

画素値を更新する方法として,逐次法,並列法があります.
逐次法(sequential method)は,更新した画像をそのまま使い,次処理に移るのに対し,
並列法(parallel method)では,消去可能かどうかを検証する検証用画像と,画素値の更新を行う更新用画像を別々に持ち,更新用画像に結果を反映していきます.そして,全画素の処理が終了したら,更新用画像を,次処理の検証用画像とします.

今回は,並列法を用います.
また,サブサイクル1,サブサイクル2を交互に行います.それぞれの挙動は以下.
サブサイクル1 - 右上から,左下に向かいラスタスキャン.
サブサイクル2 - 左下から,右上に向かいラスタスキャン.

そして,ラスタスキャンをしながら,論理フィルタ(logical filter)を用いて,
上記の1,2,3の条件を満たすかどうかを判断します.
(*は0,1どちらでもよいことを意味します.)

*0*
*1*
***
***
*10
***

サブサイクル1において,消去する場合


*0*
*11
*10
01*
110
***

***
010
*1*
*0*
11*
*0*
*1*
010
***
*0*
*11
*0*

***
01*
10*
10*
01*
***
*01
*10
***
***
*10
*01

010
111
0*0
010
*11
010
0*0
111
010
010
11*
010

サブサイクル1において,消去しない場合


***
*1*
*0*
***
01*
***

サブサイクル2において,消去する場合


01*
11*
*0*
***
011
*10

***
010
*1*
*0*
11*
*0*
*1*
010
***
*0*
*11
*0*

***
01*
10*
10*
01*
***
*01
*10
***
***
*10
*01

010
111
0*0
010
*11
010
0*0
111
010
010
11*
010

サブサイクル2において,消去しない場合


上のフィルタでは,
“消去する”に当てはまり,かつ,“消去しない”に当てはまらない場合のみ,黒画素(1)を消去(白画素(0)にする)します.

サブサイクル1,サブサイクル2を交互に繰り返し,更新(消去)する画素が無くなった場合,細線化処理を終了します.

例:


Fig.1
この画像を細線化すると,Fig.2のようになります.


Fig.2

こんな感じになります.きれいな細線化では無いですが,ちゃんと出来ています.

次は,細線の特徴点抽出について…

0 件のコメント: