このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
イメージ内の境界トレース
イメージ内のオブジェクト境界のトレース
この例では、バイナリ イメージ内の単一オブジェクトおよびすべてのオブジェクトの境界をトレースする方法を説明します。
イメージを読み取って表示します。
I = imread("coins.png");
imshow(I)
イメージをバイナリ イメージに変換します。関数 bwtraceboundary
および bwboundaries
は、バイナリ イメージでのみ機能します。
BW = imbinarize(I); imshow(BW)
単一オブジェクトの境界
バイナリ イメージで単一オブジェクトの境界をトレースするには、まずオブジェクトの境界上にある 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);
すべてのオブジェクトの境界
この例で使用しているバイナリ イメージには、関数 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
トレース開始方向の選択
オブジェクトによっては、開始点として指定する境界上のピクセル、およびトレース開始方向 (北や南など) の選択には注意が必要です。
たとえば、オブジェクトに穴がある場合、オブジェクトの細い部分に開始ピクセルを指定すると、最初のトレース方向がオブジェクトの外側の境界をトレースするか穴の境界をトレースするかを決定します。穴のないオブジェクトでは、トレース開始方向のパラメーターの選択はあまり重要ではありません。
次の図は、開始ピクセルがオブジェクトの細くなっている部分にあるとき、トレース開始方向が北の場合と南の場合ではトレースされるピクセルが異なることを示します。連結性の既定値は 8 です。
トレース開始方向が境界トレースに与える影響
参考
bwboundaries
| bwtraceboundary
| visboundaries
| edge