このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
bwboundaries
バイナリ イメージのオブジェクト境界をトレース
構文
説明
は、名前と値の引数を使用して (R2023a 以降)、トレース スタイルおよび返された頂点座標の順序を指定します。B
= bwboundaries(___,Name=Value
)
例
領域境界をイメージ上に重ね合わせる
グレースケール イメージをワークスペースに読み取ります。
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
入力引数
BW
— バイナリ イメージ
2 次元数値行列 | 2 次元 logical 行列
バイナリ イメージ。2 次元 logical 行列または 2 次元数値行列として指定します。数値入力の場合、非ゼロのピクセルは 1
(true
) であると見なされます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
conn
— ピクセルの連結性
8
(既定値) | 4
ピクセルの連結性。次の表のいずれかの値を指定します。
値 | 意味 | |
---|---|---|
2 次元連結性 | ||
| ピクセルのエッジの部分が接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、水平方向または垂直方向に連結します。 |
現在のピクセルを灰色で示します。 |
| ピクセルのエッジまたはコーナーが接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、水平方向、垂直方向または対角方向に連結します。 |
現在のピクセルを灰色で示します。 |
データ型: double
options
— 親と子の両方の境界を探索するかどうかを決定
"holes"
(既定値) | "noholes"
親と子の両方の境界を探索するかどうかを決定します。次のいずれかに指定します。
オプション | 意味 |
---|---|
| オブジェクトと穴の両境界を探索します。これは既定の設定です。 |
| オブジェクト (親と子) の境界を探索します。これにより、パフォーマンスが向上します。 |
データ型: char
| string
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: B = bwboundaries(BW,TraceStyle="pixeledge")
は、バイナリ イメージ BW
内のオブジェクトの境界を、境界ピクセルの外側のエッジに沿ってトレースします。
TraceStyle
— トレース スタイル
"pixelcenter"
(既定値) | "pixeledge"
R2023a 以降
境界に沿ったトレース スタイル。"pixelcenter"
または "pixeledge"
として指定します。
トレース スタイル | 意味 |
---|---|
| 境界を、境界ピクセルの中心を接続する多角形としてトレースします。 |
| 境界を、境界ピクセルの外側のエッジに沿う多角形としてトレースします。 |
CoordinateOrder
— 返された頂点座標の順序
"yx"
(既定値) | "xy"
R2023a 以降
返された頂点座標の順序。"yx"
または "xy"
として指定します。
トレース スタイル | 意味 |
---|---|
| 境界頂点を (y, x) 座標として返します。これは、( |
| 境界頂点を (x, y) 座標として返します。 |
出力引数
B
— 境界頂点の座標
p 行 1 列の cell 配列
境界頂点の座標。p 行 1 列の cell 配列として返されます。ここで、p はオブジェクトと穴の数です。B
内の最初の n
セルはオブジェクトの境界で、残りのセルは穴の境界です。
cell 配列内の各セルには、q 行 2 列の行列が含まれています。行列内の各行には境界に沿った頂点の座標が含まれています。q は対応する領域の境界頂点の数です。
L
— ラベル行列
非負の整数の 2 次元行列
連続領域のラベル行列。非負の整数から成る 2 次元行列として返されます。k 番目の領域には、値 k をもつ L
内のすべての要素が含まれています。L
で表すオブジェクトと穴の数は、max(L(:))
に等しくなります。背景は、L
のゼロの値をとる要素で構成されています。
データ型: double
n
— 検出されたオブジェクトの数
非負の整数
検出されたオブジェクトの数。非負の整数として返されます。
データ型: double
A
— 境界と穴の親子の依存関係
正方でスパースの logical 行列
境界と穴の親子の依存関係。辺の長さが 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.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
bwboundaries
では C コードの生成がサポートされています (MATLAB® Coder™ が必要)。汎用のMATLAB Host Computer
ターゲット プラットフォームを選択した場合、プリコンパイルされたプラットフォーム固有の共有ライブラリを使用するコードが、bwboundaries
によって生成されます。共有ライブラリを使用するとパフォーマンスの最適化は維持されますが、コードを生成できるターゲット プラットフォームが限定されます。詳細については、Image Processing Toolbox でサポートされているコード生成のタイプを参照してください。conn
パラメーターはコンパイル時の定数でなければなりません。options
パラメーターはコンパイル時の定数でなければなりません。戻り値
A
は非スパース行列のみ可能で、スパース行列にはできません。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意および制限:
引数
conn
はコンパイル時の定数でなければなりません。引数
options
はコンパイル時の定数でなければなりません。戻り値
A
は非スパース行列のみ可能で、スパース行列にはできません。
バージョン履歴
R2006a より前に導入R2023a: 新しい名前と値の引数 TraceStyle
および CoordinateOrder
名前と値の引数 TraceStyle
は、境界ピクセルの外側のエッジに沿った境界のトレースをサポートします。以前、この関数は境界ピクセルの中心を介した境界のトレースのみを行っていました。
名前と値の引数 CoordinateOrder
は、(x, y) の順序で境界座標を返すことをサポートします。以前、この関数は (y, x) の順序でのみ境界座標を返していました。
参考
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)