第6回CADセミナー@岐阜 演習8/ラベリング処理
この演習では2値画像のラベリング処理を取り扱います.
ラベリング処理は,CAD技術の中でもっとも重要で基本的な処理です.
これは,抽出した領域の特徴を調べたり,個数を数えたりすることの基本になるからです.
ラベリング処理とは,つながっている領域に番号を付けていく処理です.
つまり,画像中に孤立した領域が何個あるのかを数えたり,ある番号のついた領域が
どんな形をしているのかを調べるのに有効な処理です.
ラベリングの手法は非常に多くありますが,今回は比較的単純な方法で
ラベルづけを行います.基本方針は以下のようです
ちょっとややこしいですが,頑張ってください.
- 画像を走査して,ラベルがついていない画素を見つけ,ついていなければ
新しい番号(ラベル)を付ける
- 見つかった画像の連結性を調べて,つながっているが画素には同じ番号(ラベル)
をつける.
- 新しくつけたラベルの連結性もしらべて,連結があれば,同じ番号をつける
- この操作を,ラベルがつけれなくなるまで続ける
- そうしたら,また最初に戻り,ラベルのついていない画素を見つけ,そこに
新しいラベルをつけて繰り返す.
- 画像全部が終われば終了
ここで,連結の評価ですが,8近傍の中に存在すれば接続していると評価します.
この評価方法を変化させれば当然結果は変わります.
さて,演習では,実際にプログラムを作成します.
コンパイルは今回Makefileを用意したので,
単純に
make と入力してください.
実行するには,
proc 入力ファイル名 画像の幅 画像の高さ 出力ファイル名
の順で入力してください.
画像を開き,配列に保存して、処理した結果を出力ファイル名をつけて
ラベル画像をハードディスク上に保存します。
方針:
- 2値化は画像の平均値で行う。
- dilationを行い,
- erosionを行い,
- ラベルつけを行い,
- ラベル数を表示する
- ラベル画像を保存する。
になります。
プログラムのmain.cはこちら.
ラベリングの関数labeling.cはこちら.
膨張処理:dilation.cはこちら.
収縮処理:erosion.cはこちら.
さらには...
膨張処理,収縮処理を繰り返した後にラベリングを行うと
ラベル数はどうなりますか?
同様に,Opening, Closingを繰り返すとどのようなラベル数になるのか,実験してみましょう.
次に,ラベル画像を濃淡で表示することも考えてみましょう.
出力の画像ファイルには,ラベルごとに違う画素値が割り当てられているわけです
したがって,以前の演習で学んだ 諧調処理の技術が役立ちます.
ラベル画像に0〜255が割り当てられるように,main.cの最後のファイルの保存部分を改造してみましょう.
以上,2値画像へのラベリングの例を示しました.
まとめると,
- 2値画像では,領域が明確になる
- したがって,画像中の個数を数えることができる
- ラベリングを行うためには,前処理が重要
- 連結性の判定が重要.8近傍で判定するか,4近傍でみるのか.
- 濃淡画像にはそのまま応用することは困難