Main Content

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

bwboundaries

バイナリ イメージのオブジェクト境界をトレース

説明

B = bwboundaries(BW) は、バイナリ イメージ BW において、オブジェクトの外側の境界を、そのオブジェクトの内部にあるホール (穴) の境界と共にトレースします。また bwboundaries は、親オブジェクトに完全に囲まれた子オブジェクトの外側とホールの境界もトレースします。この関数は、境界ピクセルの位置の cell 配列 B を返します。

この図は、これらの成分を示したものです。

Parent objects in a binary image are white blobs that can have holes. Children objects appear as islands within the holes.

B = bwboundaries(BW,conn) は、オブジェクトの境界をトレースする際に使用する連結性 conn を指定します。

B = bwboundaries(___,options) は、オブジェクトの外側の境界をトレースし、options"holes" または "noholes" を設定することで穴の境界を含めるかどうかを指定します。

B = bwboundaries(___,Name=Value) は、名前と値の引数を使用して (R2023a 以降)、トレース スタイルおよび返された頂点座標の順序を指定します。

[B,L] = bwboundaries(___) は、オブジェクトと穴にラベルを付けるラベル行列 L も返します。

[B,L,n,A] = bwboundaries(___) は、見つかったオブジェクト数 n と隣接した行列 A も返します。

すべて折りたたむ

グレースケール イメージをワークスペースに読み取ります。

I = imread('rice.png');

局所的な適応しきい値処理を使用してグレースケール イメージをバイナリ イメージに変換します。

BW = imbinarize(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

バイナリ イメージをワークスペースに読み取ります。

BW = imread('blobs.png');

イメージ内の領域の境界を計算します。

[B,L,N,A] = bwboundaries(BW);

境界を重ね合わせたイメージを表示します。ラベル行列に基づいて領域番号を各境界の横に追加します。ズーム ツールを使用して個々のラベルを確認します。

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

関数 spy を使用して隣接行列を表示します。

figure
spy(A);

バイナリ イメージをワークスペースに読み取ります。

BW = imread('blobs.png');

境界を計算します。

[B,L,N] = bwboundaries(BW);

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

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

イメージをワークスペースに読み取ります。

BW = imread('blobs.png');

親境界を赤で表示し、それらの穴を緑で表示します。

[B,L,N,A] = bwboundaries(BW); 
figure; imshow(BW); hold on; 
% Loop through object boundaries  
for k = 1:N 
    % Boundary k is the parent of a hole if the k-th column 
    % of the adjacency matrix A contains a non-zero element 
    if (nnz(A(:,k)) > 0) 
        boundary = B{k}; 
        plot(boundary(:,2),... 
            boundary(:,1),'r','LineWidth',2); 
        % Loop through the children of boundary k 
        for l = find(A(:,k))' 
            boundary = B{l}; 
            plot(boundary(:,2),... 
                boundary(:,1),'g','LineWidth',2); 
        end 
    end 
end

入力引数

すべて折りたたむ

バイナリ イメージ。2 次元 logical 行列または 2 次元数値行列として指定します。数値入力の場合、非ゼロのピクセルは 1 (true) であると見なされます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

ピクセルの連結性。次の表のいずれかの値を指定します。

意味

2 次元連結性

4

ピクセルのエッジの部分が接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、水平方向または垂直方向に連結します。

Center pixel connected to four pixels

現在のピクセルを灰色で示します。

8

ピクセルのエッジまたはコーナーが接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、水平方向、垂直方向または対角方向に連結します。

Center pixel connected to eight pixels

現在のピクセルを灰色で示します。

データ型: double

親と子の両方の境界を探索するかどうかを決定します。次のいずれかに指定します。

オプション

意味

"holes"

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

"noholes"

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

データ型: char | string

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: B = bwboundaries(BW,TraceStyle="pixeledge") は、バイナリ イメージ BW 内のオブジェクトの境界を、境界ピクセルの外側のエッジに沿ってトレースします。

R2023a 以降

境界に沿ったトレース スタイル。"pixelcenter" または "pixeledge" として指定します。

トレース スタイル

意味

"pixelcenter"

境界を、境界ピクセルの中心を接続する多角形としてトレースします。

"pixeledge"

境界を、境界ピクセルの外側のエッジに沿う多角形としてトレースします。

R2023a 以降

返された頂点座標の順序。"yx" または "xy" として指定します。

トレース スタイル

意味

"yx"

境界頂点を (y, x) 座標として返します。これは、(row, column) 座標と同じ順序です。

"xy"

境界頂点を (x, y) 座標として返します。

出力引数

すべて折りたたむ

境界頂点の座標。p 行 1 列の cell 配列として返されます。ここで、p はオブジェクトと穴の数です。B 内の最初の n セルはオブジェクトの境界で、残りのセルは穴の境界です。

cell 配列内の各セルには、q 行 2 列の行列が含まれています。行列内の各行には境界に沿った頂点の座標が含まれています。q は対応する領域の境界頂点の数です。

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

データ型: double

検出されたオブジェクトの数。非負の整数として返されます。

データ型: double

境界と穴の親子の依存関係。辺の長さが max(L(:)) の正方、スパース、logical 行列として返されます。A の行と列は B に格納された境界の位置に対応します。A(i,j)=1 は、オブジェクト i がオブジェクト j の子オブジェクトであることを意味します。k 番目の境界を囲むか、それによって囲まれる境界は、A を次のように使用すると検出できます。

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

データ型: double

アルゴリズム

関数 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.

拡張機能

バージョン履歴

R2006a より前に導入

すべて展開する