メインコンテンツ

イメージ内の境界トレース

イメージ内のオブジェクト境界のトレース

この例では、バイナリ イメージ内の単一オブジェクトおよびすべてのオブジェクトの境界をトレースする方法を説明します。

イメージを読み取って表示します。

I = imread("coins.png");
imshow(I)

Figure contains an axes object. The hidden axes object contains an object of type image.

イメージをバイナリ イメージに変換します。関数 bwtraceboundary および bwboundaries は、バイナリ イメージでのみ機能します。

BW = imbinarize(I);
imshow(BW)

Figure contains an axes object. The hidden axes object contains an object of type image.

単一オブジェクトの境界

バイナリ イメージで単一オブジェクトの境界をトレースするには、まずオブジェクトの境界上にある 1 つのピクセルの行と列の座標を指定します。この例では列の座標を選択します。この例では、次に、その列で最も上にあるオブジェクトの行座標を計算します。

numCols = size(BW,2);
col = 60;
row = find(BW(:,col),1)
row = 
27

指定した点から境界をトレースするには、関数 bwtraceboundary を使用します。指定する必要のある引数は、バイナリ イメージ、開始点の座標 (行と列)、およびトレースの開始方向です。この例では北 ("N") を指定しています。

boundary = bwtraceboundary(BW,[row, col],"N");

元のグレースケール イメージ上で境界をプロットします。

imshow(I)
hold on
plot(boundary(:,2),boundary(:,1),"g",LineWidth=3);

Figure contains an axes object. The hidden axes object contains 2 objects of type image, line.

すべてのオブジェクトの境界

この例で使用しているバイナリ イメージには、関数 bwboundaries が別のオブジェクトとして解釈する黒い領域を含んでいるコインがあります。bwboundaries が必ずコインの外周だけをトレースするように、関数 imfill を使用して各コインの内部領域を塗りつぶします。

BW_filled = imfill(BW,"holes");

関数 bwboundaries を使用して、イメージに含まれるすべてのコインの境界をトレースします。bwboundaries は cell 配列を返します。各セルにはイメージ内の 1 つのオブジェクトの行座標と列座標が入っています。

boundaries = bwboundaries(BW_filled);

元のグレースケール イメージ上で、すべてのコインの境界をプロットします。

for k=1:10
   b = boundaries{k};
   plot(b(:,2),b(:,1),"g",LineWidth=3);
end

Figure contains an axes object. The hidden axes object contains 12 objects of type image, line.

トレース開始方向の選択

オブジェクトによっては、開始点として指定する境界上のピクセル、およびトレース開始方向 (北や南など) の選択には注意が必要です。

たとえば、オブジェクトに穴がある場合、オブジェクトの細い部分に開始ピクセルを指定すると、最初のトレース方向がオブジェクトの外側の境界をトレースするか穴の境界をトレースするかを決定します。穴のないオブジェクトでは、トレース開始方向のパラメーターの選択はあまり重要ではありません。

次の図は、開始ピクセルが 1 ピクセル幅の境界上にある場合に、最初のステップの方向が境界のトレースにどのように影響するかを示しています。連結性の既定値は 8 です。最初のステップが北向きの場合、境界はオブジェクトの外側のエッジに沿って時計回りにトレースされますが、最初のステップが南向きの場合、境界はオブジェクトの内部のエッジに沿って反時計回りにトレースされます。

トレース開始方向が境界トレースに与える影響

参考

| | |

トピック