bwdist() - Image Processing
D = bwdist(BW) computes
the Euclidean distance transform of the binary image BW.
For each pixel in BW, the distance transform assigns
a number that is the distance between that pixel and the nearest nonzero
pixel of BW. bwdist uses the
Euclidean distance metric by default. BW can have
any dimension. D is the same size as BW. [D,IDX] = bwdist(BW) also
computes the closest-pixel map in the form of an index array, IDX.
(The closest-pixel map is also called the feature map, feature transform,
or nearest-neighbor transform.) IDX has the same
size as BW and D. Each element
of IDX contains the linear index of the nearest
nonzero pixel of BW.[D,IDX] = bwdist(BW,method) computes
the distance transform, where method specifies
an alternate distance metric. method can
take any of the following values. The method string
can be abbreviated.MethodDescription
'chessboard'In
2-D, the chessboard distance between (x1,y1) and (x2,y2)
is max(│x1 – x2│,│y1 – y2│).
'cityblock'In
2-D, the cityblock distance between (x1,y1) and (x2,y2)
is │x1 – x2│
+ │y1 – y2│.
'euclidean'In
2-D, the Euclidean distance between (x1,y1) and (x2,y2)
is (x1−x2)2+(y1−y2)2.This is the default method.
'quasi-euclidean'In
2-D, the quasi-Euclidean distance between (x1,y1)
and (x2,y2) is|x1−x2|+(2−1)|y1−y2|, |x1−x2|>|y1−y2|(2−1)|x1−x2|+|y1−y2|, otherwise.
[gpuarrayD, gpuarrayIDX]= bwdist(gpuarrayBW) computes
the Euclidean distance transform of the binary image gpuarrayBW,
performing the operation on a GPU. The images must be 2-D and have
less than 232-1 elements. In addition,
you can only compute the Euclidean distance metric. This syntax requires
the Parallel Computing Toolbox™.Code Generation support:
Yes.MATLAB Function Block support:
Yes.
Syntax
D = bwdist(BW)[D,IDX] = bwdist(BW)[D,IDX] = bwdist(BW,method)[gpuarrayD, gpuarrayIDX]= bwdist(gpuarrayBW)
Example
Compute the Euclidean distance transformCreate an image.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
Calculate the distance transform.[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 19In the nearest-neighbor matrix IDX the values 7 and 19 represent
the position of the nonzero elements using linear matrix indexing.
If a pixel contains a 7, its closest nonzero neighbor is at linear
position 7.Compute the Euclidean distance transform on a GPUCreate an image.bw = gpuArray.zeros(5,5);
bw(2,2) = 1;
bw(4,4) = 1;
Calculate the distance transform.[D,IDX] = bwdist(bw)
Compare 2-D Distance Transforms for Supported Distance MethodsOpen This Example
This example shows how to compare the 2-D distance transforms for supported distance methods. In the figure, note how the quasi-Euclidean distance transform best approximates the circular shape achieved by the Euclidean distance method.
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)
Compare Isosurface Plots for Distance Transforms of 3-D ImageOpen This Example
This example shows how to compare isosurface plots for the distance transforms of a 3-D image containing a single nonzero pixel in the center.
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')
Output / Return Value
Limitations
Alternatives / See Also
Reference