二値化画像処理された画像において、白の部分(または黒の部分)が連続した画素に同じ番号を割り振る処理を
ラベリングと言います。
通常、同じ番号ごとの面積(画素数)や幅、高さなどの特徴量を求めて欠陥検査や分類処理などに用いられます。
ラベリングには、二値化された画像の縦、横方向に連続している部分を同じラベルにする4連結と、
縦、横、斜め方向に連続している部分を同じラベルにする8連結との2種類の処理があります。
(4近傍、8近傍という場合もあります。)
【二値化画像】 | ||
【4連結】 | 【8連結】 | |
以下、8連結の場合において、ラベリング処理アルゴリズムを紹介します。
まず、画像全ての画素のラベル番号を0(ゼロ)で初期化しておき、ラベリングで番号を割り付けるための
ラベリング番号のルックアップテーブルを用意しておきます。(テーブルの使い方の詳細は後ほど)
そして、画像の左上からラスタスキャンを行い、画素の色が白の位置を検索します。
白の画素の左上、上、右上、左の画素のラベル番号を参照し、全て0(ゼロ)の場合は、最後に割り振った番号+1のラベル番号を割り振ります。
もし、参照した画素のラベル番号が複数存在した場合は、最小の番号を割り振ります。
最初に番号を割り振った様子↓
この処理を左上からラスタスキャンして続けていきます。
新しい番号が割り振られるとき↓
新しい番号が割り振られるとき↓ その2
参照した画素のラベル番号が複数存在した場合、最小の番号を割り振ります。
このとき、用いなかったラベル番号(下図の例では3)のルックアップテーブルの番号を最小の番号に書き換えます。
同様に、処理を続けていきます↓
全ての白の画素に番号が割り振れれた様子↓
ただし、よ~く見ると、ラベル番号の2や3など、連続していない部分が存在している事に気がつきます。
そこで、ルックアップテーブルの出番です。
処理の途中でルックアップテーブルの番号を変更した番号を
2→1、3→1、6→5
に変更すると、連続した領域は同じ番号になります。
このまま番号を変更しても良いのですが、ラベル番号が虫食いになるのも気持ちが悪いので、以下のようにルックアップテーブルの番号を詰め直してから、ルックアップテーブルを参照し、全画素のラベル番号を修正すると、以下のようになります。
基本的なアルゴリズムは上記、紹介したアルゴリズムで良いのですが、ラベリング処理を行う画像のパターンによってはうまくラベル番号が割り振られない場合があります。
そこは、何とかして(ちょっと説明が難しい部分)うまく割り振られるようにチャレンジしてみて下さい。
参考までに、ラベリング処理をすると失敗しやすい特徴的な画像を添付しておきます。↓
◆Level.1
◆Level.2
◆Level.Max!?
ラベリング処理のアルゴリズムには、この手法の他にも輪郭線を追跡し、閉じた領域を1つのラベルとする手法や、ランレングス的に求める方法もあります。