ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

bwboundaries

バイナリ イメージ内の領域の境界をトレース

構文

B = bwboundaries(BW)
B = bwboundaries(BW,conn)
B = bwboundaries(BW,conn,options)
[B,L] = bwboundaries(...)
[B,L,N,A] = bwboundaries(...)

説明

B = bwboundaries(BW) は、バイナリ イメージ BW において、オブジェクトの外側の境界をオブジェクトの内部にあるホール (穴) の境界とともにトレースします。また bwboundaries は、一番外側のオブジェクト (親) の内部に入り、子のオブジェクト (親オブジェクトに完全に囲まれたオブジェクト) をトレースします。BW は、非ゼロのピクセルがオブジェクトに属しており、かつ背景を構成するピクセルが 0 のバイナリ イメージでなければなりません。次の図では、これらの成分を説明します。

bwboundaries は、P 行 1 列のセル配列 B です。ここで、P はオブジェクトと穴の数です。セル配列内の各セルには、Q 行 2 列の配列が含まれています。配列内の各行には、境界のピクセルの行座標と列座標が含まれています。Q は、対応する領域の境界のピクセル数です。

B = bwboundaries(BW,conn) は、親と子の境界をトレースする際に使用する連結数を指定します。conn には、次のスカラー値のいずれかを使用できます。

意味

4

4 連結近傍

8

8 連結近傍。これは既定の設定です。

B = bwboundaries(BW,conn,options) は、オプション引数です。ここで、options には、次の値のいずれかを使用できます。

意味

'holes'

オブジェクトと穴の両境界を検索します。これは既定の設定です。

'noholes'

オブジェクト (親と子) の境界を検索します。これにより、パフォーマンスが向上します。

[B,L] = bwboundaries(...) は 2 番目の出力引数として、ラベル行列 L を返します。オブジェクトと穴はラベル付けされています。L は、連続領域を表す非負整数の 2 次元配列です。k 番目の領域には、値 k をもつ L 内のすべての要素が含まれています。L で表すオブジェクトと穴の数は、max(L(:)) に等しくなります。背景は、L のゼロの値をとる要素で構成されています。

[B,L,N,A] = bwboundaries(...) は、見つかったオブジェクト数 N と隣接した配列 A を返します。B 内の最初の N セルは、オブジェクトの境界です。A は、親、子、ホール (穴) の依存関係を表します。A は、辺の長さ max(L(:)) をもつ正方でスパースの論理行列で、その行と列は B に格納された境界の位置に対応します。

B{m} で囲まれた境界と B{m} を囲む境界は、双方とも、A を次のようにして使用すれば検出できます。

enclosing_boundary  = find(A(m,:));
enclosed_boundaries = find(A(:,m));

クラス サポート

BW は、論理値または数値を使用できますが、実数で 2 次元の非スパースでなければなりません。LNdouble です。A はスパースの logical です。

例 1

強度イメージを読み取り、しきい値を適用します。jet カラーマップを使用して、ラベル付けされたオブジェクトを、白で輪郭をとった領域の境界をもつグレーの背景に表示します。

I = imread('rice.png');
BW = im2bw(I, graythresh(I));
[B,L] = bwboundaries(BW,'noholes');
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
    boundary = B{k};
    plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end

例 2

バイナリ イメージを読み取って表示します。領域境界をイメージに重ね合わせます。領域番号 (ラベル行列に基づいて) を示すテキストを各境界に表示します。また、MATLAB® 関数 spy を使用して、隣接した行列を表示します。

イメージを表示した後で、ズーム ツールを使用して個々のラベルを読み取ります。

BW = imread('blobs.png');
[B,L,N,A] = bwboundaries(BW);
figure, imshow(BW); hold on;
colors=['b' 'g' 'r' 'c' 'm' 'y'];
for k=1:length(B)
    boundary = B{k};
    cidx = mod(k,length(colors))+1;
    plot(boundary(:,2), boundary(:,1),...
         colors(cidx),'LineWidth',2);
    %randomize text position for better visibility
    rndRow = ceil(length(boundary)/(mod(rand*k,7)+1));
    col = boundary(rndRow,2); row = boundary(rndRow,1);
    h = text(col+1, row-1, num2str(L(row,col)));
    set(h,'Color',colors(cidx),...
        'FontSize',14,'FontWeight','bold');
end
figure; spy(A);

例 3

オブジェクトの境界を赤で表示し、穴の境界を緑で表示します。

BW = imread('blobs.png');
[B,L,N] = bwboundaries(BW);
figure; imshow(BW); hold on;
for k=1:length(B),
    boundary = B{k};
    if(k > N)
        plot(boundary(:,2),...
            boundary(:,1),'g','LineWidth',2);
    else
        plot(boundary(:,2),...
            boundary(:,1),'r','LineWidth',2);
    end
end

例 4

親境界を赤で表示し (隣接した行列の空行はいずれも親に属します)、それらの穴を緑で表示します。

BW = imread('blobs.png');
[B,L,N,A] = bwboundaries(BW);
figure; imshow(BW); hold on;
for k=1:length(B),
    if(~sum(A(k,:)))
       boundary = B{k};
       plot(boundary(:,2),...
           boundary(:,1),'r','LineWidth',2);
       for l=find(A(:,k))'
           boundary = B{l};
           plot(boundary(:,2),...
               boundary(:,1),'g','LineWidth',2);
       end
    end
end

詳細

すべて折りたたむ

アルゴリズム

関数 bwboundaries は、Jacob の停止条件によって変更された Moore-Neighbor トレース アルゴリズムを実装します。この関数は、『Digital Image Processing Using MATLAB[1]』の初版にある関数 boundaries に基づいています。

参考文献

[1] Gonzalez, R. C., R. E. Woods, and S. L. Eddins, Digital Image Processing Using MATLAB, New Jersey, Pearson Prentice Hall, 2004.

この情報は役に立ちましたか?