Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

このツールボックスにはバイナリ イメージでオブジェクトの境界を見つけることのできる 2 つの関数が含まれています。

関数 bwtraceboundary はイメージ内にある 1 つのオブジェクトの境界上のすべてのピクセルの座標行列を返します。トレースの開始点として、オブジェクト上の境界ピクセルの場所を指定しなければなりません。

関数 bwboundaries はイメージ内のすべてのオブジェクトの境界ピクセルの座標行列を返します。

どちらの関数でも、バイナリ イメージ内の非ゼロ ピクセルがオブジェクトを、値がゼロのピクセルが背景を表します。

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

この例では、関数 bwtraceboundary を使用してバイナリ イメージ内の 1 つのオブジェクトの境界をトレースする方法を説明します。次に、関数 bwboundaries を使用してイメージ内のすべてのオブジェクトの境界をトレースします。

イメージを読み取り、それを表示します。

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

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

イメージをバイナリ イメージに変換します。bwtraceboundarybwboundaries もバイナリ イメージでしか機能しません。

BW = im2bw(I);
imshow(BW)

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

トレースするオブジェクトの境界上にある 1 つのピクセルの行と列の座標を指定します。bwboundary はこの点を境界トレースの開始点として使います。

dim = size(BW)
dim = 1×2

   246   300

col = round(dim(2)/2)-90;
row = min(find(BW(:,col)))
row = 27

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

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

元のグレースケール イメージを表示し、bwtraceboundary が返した座標を使用してイメージ上に境界をプロットします。

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

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

イメージ内のすべてのコインの境界をトレースするには、関数 bwboundaries を使用します。既定の設定では、bwboundaries はイメージ内のすべてのオブジェクトの境界を見つけます。オブジェクト内の別のオブジェクトも見つけます。この例で使用しているバイナリ イメージには、bwboundaries が別のオブジェクトとして解釈する黒い領域を含んでいるコインがあります。bwboundaries がコインだけをトレースするように、関数 imfill を使用してコインの内部領域を塗りつぶします。bwboundaries は cell 配列を返します。各セルにはイメージ内の 1 つのオブジェクトの行座標と列座標が入っています。

BW_filled = imfill(BW,'holes');
boundaries = bwboundaries(BW_filled);

bwboundaries から返された座標値を使用して元のグレースケール イメージ上のすべてのコインの境界をプロットします。

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

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

トレースの開始点と方向の選択

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

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

次の図は、開始ピクセルがオブジェクトの細くなっている部分にあるとき、トレース開始方向が北の場合と南の場合ではトレースされるピクセルが異なることを示します。連結性は既定値の 8 に設定されています。

トレース開始方向パラメーターの境界トレースに与える影響