Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

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

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

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

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

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

BW = imbinarize(I);
imshow(BW)

Figure contains an axes object. The 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 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 axes object contains 12 objects of type image, line.

トレース開始方向の選択

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

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

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

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

When the starting point is on a boundary that is one pixel wide, specifying the direction as north causes the boundary to be traced clockwise along the external edge of the object, whereas specifying the direction as south causes the boundary to be traced counterclockwise along the internal edge of the object.

参考

| | |

関連するトピック