Main Content

バイナリ イメージ内の連結要素のラベル付けと測定

連結要素の検出

バイナリ イメージ内の "連結要素" (オブジェクト) は、隣接する "on" ピクセルの集合です。隣接するピクセルの特定方法は、ピクセルの連結性がどのように定義されているかによって異なります。2 次元イメージについては、標準的な連結性が 2 つあります。

  • 4 連結 — ピクセルのエッジが接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、水平方向または垂直方向に連結します。

  • 8 連結 — ピクセルのエッジまたはコーナーが接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、水平方向、垂直方向または対角方向に連結します。

標準以外の連結性や、高次元イメージ用の連結性を定義することもできます。詳細については、ピクセルの連結性を参照してください。

以下の図に、1 つのバイナリ イメージを表す同一の行列を 2 つ示します。各行列上に、それぞれ 4 連結と 8 連結を使用した連結要素を強調表示しています。4 連結の場合は連結要素が 3 個存在しますが、8 連結の場合は連結要素は 2 個しか存在しないことになります。

連結要素は、関数 bwconncomp を使用して計算できます。次のサンプル コードで、BW は上の図に示したバイナリ行列です。この例では、2 つの隣り合ったピクセルが両方とも "on" で、水平方向または垂直方向に連結している場合に同じオブジェクトの一部になるように、連結性 4 を指定します。PixelIdxList フィールドは、各連結要素に属するピクセルのリストを識別します。

BW = zeros(8,8);
BW(2:4,2:3) = 1;
BW(5:7,4:5) = 1;
BW(2,6:8) = 1;
BW(3,7:8) = 1;
BW
BW =

     0     0     0     0     0     0     0     0
     0     1     1     0     0     1     1     1
     0     1     1     0     0     0     1     1
     0     1     1     0     0     0     0     0
     0     0     0     1     1     0     0     0
     0     0     0     1     1     0     0     0
     0     0     0     1     1     0     0     0
     0     0     0     0     0     0     0     0
cc4 = bwconncomp(BW,4)
cc4 = 

    Connectivity: 4
       ImageSize: [8 8]
      NumObjects: 3
    PixelIdxList: {[6x1 double]  [6x1 double]  [5x1 double]}

比較のため、既定の連結性 8 を使用して同じバイナリ イメージの連結要素を計算します。

cc8 = bwconncomp(BW)
cc8 = 

    Connectivity: 8
       ImageSize: [8 8]
      NumObjects: 2
    PixelIdxList: {[12x1 double]  [5x1 double]}

連結要素のラベル付け

連結要素のラベル付けとは、イメージ内の連結要素を識別し、各連結要素に一意なラベルを割り当てる処理のことです。結果として得られる行列は "ラベル行列" と呼ばれます。

以下の図の 2 つの行列は、それぞれ 4 連結と 8 連結を使用して連結要素にラベル付けをしたラベル行列を示しています。

Each connected component has a unique numeric label, starting with 1 and increasing sequentially

関数 labelmatrix を使用してラベル行列を作成します。次のサンプル コードは、前の節で定義した連結要素構造体 cc4 を引き続き使用します。

L4 = labelmatrix(cc4)
L4 =

  8×8 uint8 matrix

   0   0   0   0   0   0   0   0
   0   1   1   0   0   3   3   3
   0   1   1   0   0   0   3   3
   0   1   1   0   0   0   0   0
   0   0   0   2   2   0   0   0
   0   0   0   2   2   0   0   0
   0   0   0   2   2   0   0   0
   0   0   0   0   0   0   0   0

連結要素を可視化するには、関数 label2rgb を使用してラベル行列を疑似色イメージとして表示します。ラベル行列の各オブジェクトを識別するラベルは、関連するカラーマップの異なる色にマップされます。カラーマップ、背景色、ラベル行列の中のオブジェクトがカラーマップの中の色にどのようにマップされるかを指定できます。

RGB_label = label2rgb(L4,@copper,"c","shuffle");
imshow(RGB_label)

Labeled objects and the background each appear with a different color

バイナリ イメージ内のオブジェクトの選択

関数 bwselect を使用して、バイナリ イメージ内の個々のオブジェクトを選択します。プログラムを使用して、またはマウスで対話的に入力イメージ内のピクセルを指定します。bwselect は、入力イメージから指定したピクセルの 1 つを含むオブジェクトのみを含むバイナリ イメージを返します。

たとえば、次のコマンドを使用して、現在の軸に表示されるイメージ内のオブジェクトを選択します。

BW = bwselect;

カーソルはイメージ上に置くと十字形に変わります。選択するオブジェクトをクリックします。bwselect は、クリックした各ピクセル上に小さな星印を表示します。選択を終了したら、Return キーを押してください。bwselect は選択したオブジェクトから構成されるバイナリ イメージを返し、星印は削除されます。

連結要素のプロパティの測定

関数 regionprops と関数 bwpropfilt は、連結要素の複数のプロパティを測定できます。他の関数は、単一のプロパティを測定します。たとえば、関数 bwarea はバイナリ イメージの面積を返します。

この例は、bwarea を使用して、膨張操作の結果増加した circbw.tif 内の面積の割合をパーセントで計算します。この面積はイメージの前面のサイズの測定値で、大まかにはイメージ内の on ピクセルの数と同じです。ただし、bwareaon に設定されたピクセルの数を単に数えるわけではありません。むしろ、bwarea は面積を計算する場合に、異なるピクセル パターンに等しくない重み付けを行います。この重み付けは、離散ピクセルを使用して連続的なイメージを表す場合に、固有に存在する歪みを補償します。たとえば、50 個のピクセルの対角線は、50 個のピクセルの横の線より長くなります。bwarea が使用する重み付けの結果として、横の線は 50 の面積を占め、対角線は 62.5 の面積になります。

BW = imread("circbw.tif"); 
SE = ones(5);
BW2 = imdilate(BW,SE);
increase = (bwarea(BW2) - bwarea(BW))/bwarea(BW)
increase =

    0.3456

参考

| | | | | |

関連する例

詳細