ドキュメンテーション

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

bwdist

バイナリ イメージの距離変換

構文

D = bwdist(BW)
[D,IDX] = bwdist(BW)
[D,IDX] = bwdist(BW,method)
[gpuarrayD, gpuarrayIDX]= bwdist(gpuarrayBW)

説明

D = bwdist(BW) は、バイナリ イメージ BW のユークリッド距離変換を計算します。BW 内の各ピクセルに対しては、距離変換によって、そのピクセルから BW 内の最も近い非ゼロ ピクセルまでの距離の数値が割り当てられます。bwdist は、既定ではユークリッド距離計量を使用します。BW は任意の次元に設定できます。DBW と同じサイズです。

この関数はコード生成をサポートしています (ヒントを参照してください)。

[D,IDX] = bwdist(BW) は、最も近いピクセルのマップをインデックス配列 IDX の形式で計算します。(最も近いピクセルのマップは、特徴マップ、特徴変換または最近傍変換とも呼ばれます)。IDX のサイズは BW および D と同じです。IDX の各要素には、BW 内の最も近い非ゼロ ピクセルの線形インデックスが含まれています。

[D,IDX] = bwdist(BW,method) は、距離変換を計算します。ここで、method は、別の距離計量を指定します。method は、次の値のいずれかを使用できます。文字列 method は省略形でも構いません。

メソッド

説明

'chessboard'

2 次元の場合、(x1,y1) と (x2,y2) の間のチェス盤距離は、最大 (│x1 – x2│,│y1 – y2│) となります。

'cityblock'

2 次元では、(x1,y1) と (x2,y2) の間のシティブロック距離は、│x1 – x2│ + │y1 – y2│ です。

'euclidean'

2 次元の場合、(x1,y1) と (x2,y2) の間のユークリッド距離は、

(x1x2)2+(y1y2)2.

です。

これは既定のメソッドです。

'quasi-euclidean'

2 次元の場合、(x1,y1) と (x2,y2) の間の準ユークリッド距離は、次のようになります。

|x1x2|+(21)|y1y2|, |x1x2|>|y1y2|

(21)|x1x2|+|y1y2|, otherwise.

[gpuarrayD, gpuarrayIDX]= bwdist(gpuarrayBW) は、GPU で演算を実行して、バイナリ イメージ gpuarrayBW のユークリッド距離変換を計算します。イメージは 2 次元で、含まれる要素数は 232-1 個未満でなければなりません。また、計算できるのは、ユークリッド距離計量のみです。この構文では Parallel Computing Toolbox™ が必要です。

クラス サポート

BW は数値または論理値になりますが、非スパースでなければなりません。DBW と同じサイズの単一行列です。IDX のクラスは入力イメージの要素の数によって異なり、次の表を使用して決定します。

クラス範囲
'uint32'numel(BW) <= 232 − 1
'uint64'numel(BW) >= 232

gpuarrayBW は、uint8uint16uint32int8int16int32singledouble または logical のいずれかの型の 2 次元の gpuArray です。gpuarrayD は、gpuarrayBW と同じサイズで、基になるクラスが single である gpuArray です。gpuarrayIDX は、gpuarrayBW と同じサイズで、基になるクラスが uint32 である gpuArray です。

すべて折りたたむ

ユークリッド距離変換の計算

イメージを作成します。

bw = zeros(5,5); 
bw(2,2) = 1; 
bw(4,4) = 1
bw =
     0     0     0     0     0
     0     1     0     0     0
     0     0     0     0     0
     0     0     0     1     0
     0     0     0     0     0

距離変換を計算します。

[D,IDX] = bwdist(bw)
D =
    1.4142    1.0000    1.4142    2.2361    3.1623
    1.0000         0    1.0000    2.0000    2.2361
    1.4142    1.0000    1.4142    1.0000    1.4142
    2.2361    2.0000    1.0000         0    1.0000
    3.1623    2.2361    1.4142    1.0000    1.4142

IDX =

     7     7     7     7     7
     7     7     7     7    19
     7     7     7    19    19
     7     7    19    19    19
     7    19    19    19    19

最近傍行列 IDX の場合、値 719 は、線形行列インデックスを使用して、非ゼロ要素の位置を表します。ピクセルに 7 が含まれている場合、最も近い非ゼロ近傍は線形位置 7 です。

GPU でのユークリッド距離変換の計算

イメージを作成します。

bw = gpuArray.zeros(5,5); 
bw(2,2) = 1; 
bw(4,4) = 1;

距離変換を計算します。

[D,IDX] = bwdist(bw)

サポートされている距離メソッドの 2 次元距離変換の比較

この例では、サポートされている距離メソッドの 2 次元距離変換を比較する方法を説明します。Figure では、ユークリッド距離メソッドで取得した円に対し、準ユークリッド距離変換がどのようにして最良近似を行うのかに注意してください。

bw = zeros(200,200); bw(50,50) = 1; bw(50,150) = 1;
bw(150,100) = 1;
D1 = bwdist(bw,'euclidean');
D2 = bwdist(bw,'cityblock');
D3 = bwdist(bw,'chessboard');
D4 = bwdist(bw,'quasi-euclidean');
figure
subplot(2,2,1), subimage(mat2gray(D1)), title('Euclidean')
hold on, imcontour(D1)
subplot(2,2,2), subimage(mat2gray(D2)), title('City block')
hold on, imcontour(D2)
subplot(2,2,3), subimage(mat2gray(D3)), title('Chessboard')
hold on, imcontour(D3)
subplot(2,2,4), subimage(mat2gray(D4)), title('Quasi-Euclidean')
hold on, imcontour(D4)

3 次元イメージの距離変換の等値面プロットの比較

この例では、中心に非ゼロ ピクセルが 1 つある 3 次元イメージの距離変換の等値面プロットを比較する方法を説明します。

bw = zeros(50,50,50); bw(25,25,25) = 1;
D1 = bwdist(bw);
D2 = bwdist(bw,'cityblock');
D3 = bwdist(bw,'chessboard');
D4 = bwdist(bw,'quasi-euclidean');
figure
subplot(2,2,1), isosurface(D1,15), axis equal, view(3)
camlight, lighting gouraud, title('Euclidean')
subplot(2,2,2), isosurface(D2,15), axis equal, view(3)
camlight, lighting gouraud, title('City block')
subplot(2,2,3), isosurface(D3,15), axis equal, view(3)
camlight, lighting gouraud, title('Chessboard')
subplot(2,2,4), isosurface(D4,15), axis equal, view(3)
camlight, lighting gouraud, title('Quasi-Euclidean')

詳細

すべて折りたたむ

ヒント

  • この関数では MATLAB® Coder™ を使用した C コードの生成がサポートされています。この関数で生成されるコードでは、プリコンパイルされたプラットフォーム固有の共有ライブラリを使用します。共有ライブラリを使用するとパフォーマンスの最適化は維持されますが、コードを生成できるターゲット プラットフォームが限定されます。詳細は、「共有ライブラリを使用したコード生成」を参照してください。

    コードを生成する際、オプションの 2 番目の入力引数 method はコンパイル時の定数でなければなりません。入力イメージのピクセル数は 232 個未満でなければなりません。

  • bwdist は、特に 2 次元の場合、高速アルゴリズムを使用して真のユークリッド距離変換を計算します。他のメソッドは、主に教育を目的としたものです。ただし、別の距離変換には、多次元入力イメージ、特に多数の非ゼロ要素をもつものに対しては、極めて高速なものもあります。

  • 関数 bwdist は Version 6.4 (R2009b) で変更されました。以前のバージョンの Image Processing Toolbox では、ユークリッド距離変換やそれに関連したラベル行列の計算に、さまざまなアルゴリズムが使用されていました。以前の実装時と同じ結果を得る必要がある場合、関数 bwdist_old を使用してください。

アルゴリズム

ユークリッド距離変換では、bwdist は、次に記載されている高速アルゴリズムを使用します。

[1] Maurer, Calvin, Rensheng Qi, and Vijay Raghavan, "A Linear Time Algorithm for Computing Exact Euclidean Distance Transforms of Binary Images in Arbitrary Dimensions," IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 25, No. 2, February 2003, pp. 265-270.

シティブロック、チェス盤、準ユークリッドの各距離変換では、bwdist は、次に記載されている 2 パスの連続スキャン アルゴリズムを使用します。

[2] Rosenfeld, Azriel and John Pfaltz, "Sequential operations in digital picture processing," Journal of the Association for Computing Machinery, Vol. 13, No. 4, 1966, pp. 471-494.

得られる距離測定値は、スキャンで使用する重み集合によって異なります。これについては、次の文献で説明されています。

[3] Paglieroni, David, "Distance Transforms: Properties and Machine Vision Applications," Computer Vision, Graphics, and Image Processing: Graphical Models and Image Processing, Vol. 54, No.1, January 1992, pp. 57-58.

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