このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
イメージ内の境界トレース
このツールボックスにはバイナリ イメージでオブジェクトの境界を見つけることのできる 2 つの関数が含まれています。
関数bwtraceboundary
はイメージ内にある 1 つのオブジェクトの境界上のすべてのピクセルの座標行列を返します。トレースの開始点として、オブジェクト上の境界ピクセルの場所を指定しなければなりません。
関数bwboundaries
はイメージ内のすべてのオブジェクトの境界ピクセルの座標行列を返します。
どちらの関数でも、バイナリ イメージ内の非ゼロ ピクセルがオブジェクトを、値がゼロのピクセルが背景を表します。
イメージ内のオブジェクト境界のトレース
この例では、関数bwtraceboundary
を使用してバイナリ イメージ内の 1 つのオブジェクトの境界をトレースする方法を説明します。次に、関数bwboundaries
を使用してイメージ内のすべてのオブジェクトの境界をトレースします。
イメージを読み取り、それを表示します。
I = imread('coins.png'); imshow(I)
イメージをバイナリ イメージに変換します。bwtraceboundary
もbwboundaries
もバイナリ イメージでしか機能しません。
BW = im2bw(I); imshow(BW)
トレースするオブジェクトの境界上にある 1 つのピクセルの行と列の座標を指定します。bwboundary
はこの点を境界トレースの開始点として使います。
dim = size(BW)
dim =1×2246 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)on; plot(boundary(:,2),boundary(:,1),'g','LineWidth',3);
イメージ内のすべてのコインの境界をトレースするには、関数bwboundaries
を使用します。既定の設定では、bwboundaries
はイメージ内のすべてのオブジェクトの境界を見つけます。オブジェクト内の別のオブジェクトも見つけます。この例で使用しているバイナリ イメージには、bwboundaries
が別のオブジェクトとして解釈する黒い領域を含んでいるコインがあります。bwboundaries
がコインだけをトレースするように、関数imfill
を使用してコインの内部領域を塗りつぶします。bwboundaries
は cell 配列を返します。各セルにはイメージ内の 1 つのオブジェクトの行座標と列座標が入っています。
BW_filled = imfill(BW,'holes'); boundaries = bwboundaries(BW_filled);
bwboundaries
から返された座標値を使用して元のグレースケール イメージ上のすべてのコインの境界をプロットします。
fork=1:10 b = boundaries{k}; plot(b(:,2),b(:,1),'g','LineWidth',3);end
トレースの開始点と方向の選択
オブジェクトによっては、開始点として指定する境界上のピクセルと、その点からのトレース方向を指定するパラメーター (北、南など) の選択には注意が必要です。
たとえば、オブジェクトに穴がある場合、オブジェクトの細い部分に開始ピクセルを指定すると、最初のトレース方向がオブジェクトの外側の境界をトレースするか穴の境界をトレースするかを決定します。穴のないオブジェクトでは、トレース開始方向のパラメーターの選択はあまり重要ではありません。
次の図は、開始ピクセルがオブジェクトの細くなっている部分にあるとき、トレース開始方向が北の場合と南の場合ではトレースされるピクセルが異なることを示します。連結性は既定値の 8 に設定されています。
トレース開始方向パラメーターの境界トレースに与える影響