第6回CADセミナー@岐阜 演習8/ラベリング処理

この演習では2値画像のラベリング処理を取り扱います.
ラベリング処理は,CAD技術の中でもっとも重要で基本的な処理です.

これは,抽出した領域の特徴を調べたり,個数を数えたりすることの基本になるからです.

ラベリング処理とは,つながっている領域に番号を付けていく処理です.
つまり,画像中に孤立した領域が何個あるのかを数えたり,ある番号のついた領域が どんな形をしているのかを調べるのに有効な処理です.

ラベリングの手法は非常に多くありますが,今回は比較的単純な方法で ラベルづけを行います.基本方針は以下のようです

ちょっとややこしいですが,頑張ってください.

  1. 画像を走査して,ラベルがついていない画素を見つけ,ついていなければ 新しい番号(ラベル)を付ける
  2. 見つかった画像の連結性を調べて,つながっているが画素には同じ番号(ラベル) をつける.
  3. 新しくつけたラベルの連結性もしらべて,連結があれば,同じ番号をつける
  4. この操作を,ラベルがつけれなくなるまで続ける
  5. そうしたら,また最初に戻り,ラベルのついていない画素を見つけ,そこに 新しいラベルをつけて繰り返す.
  6. 画像全部が終われば終了

ここで,連結の評価ですが,8近傍の中に存在すれば接続していると評価します.
この評価方法を変化させれば当然結果は変わります.

さて,演習では,実際にプログラムを作成します.

コンパイルは今回Makefileを用意したので, 単純に
make と入力してください.

実行するには,
proc 入力ファイル名 画像の幅 画像の高さ 出力ファイル名

の順で入力してください.

画像を開き,配列に保存して、処理した結果を出力ファイル名をつけて ラベル画像をハードディスク上に保存します。
方針: になります。 プログラムのmain.cはこちら
ラベリングの関数labeling.cはこちら
膨張処理:dilation.cはこちら
収縮処理:erosion.cはこちら


さらには...

膨張処理,収縮処理を繰り返した後にラベリングを行うと ラベル数はどうなりますか?
同様に,Opening, Closingを繰り返すとどのようなラベル数になるのか,実験してみましょう.

次に,ラベル画像を濃淡で表示することも考えてみましょう.
出力の画像ファイルには,ラベルごとに違う画素値が割り当てられているわけです
したがって,以前の演習で学んだ 諧調処理の技術が役立ちます.
ラベル画像に0〜255が割り当てられるように,main.cの最後のファイルの保存部分を改造してみましょう.
以上,2値画像へのラベリングの例を示しました.
まとめると,