The distance transform of an image image is defined
as
dt(u,v) = min image(u',v') + alpha (u'-u-u0)^2 + beta (v'-v'-v0)^2 u'v'
The most common use of the image distance transform is to propagate
the response of a feature detector to nearby image locations. This is
used, for example, in the implementation of certain deformable part
models or the computation of the Chamfer distance. In this tutorial,
the image distance transform is used to compute the distance of each
image pixel to the nearest element in an edge map, obtained from the
Canny's edge detector. The code of this tutorial is located in the
VLFeat folder in toolbox/demo/vl_demo_imdisttf.m.
VLFeat implements the fast distance transform algorithm of Felzenszwalb and Huttelnocher [1], which has a linear time complexity in the number of image pixels.
Consider the edge map extracted by the MATLAB built-in Canny edge detector on one of VLFeat test images:
im = vl_impattern('roofs1') ;
im = im(1:100,1:100,:) ;
imSize = [size(im,1) size(im,2)] ;
edges = zeros(imSize) + inf;
edges(edge(rgb2gray(im), 'canny')) = 0 ;
The edge map is preprocessed to assign value -inf to
the pixels that do not contain an edge element and
o to
the pixels that do. In this way, the distance transform of the image
has for each pixel the distance to the nearest edge element, provided
that one chooses
alpha=beta=1 and
v0=u0=0 in
the definition. Since these are the default values for VLFeat
implementations, the result an be computed by
[distanceTransform, neighbors] = vl_imdisttf(single(edges)) ;
The matrix neighbors contains for each
pixel
(u,v) the index of the pixel
(u',v')
where the maximum is attained in the definition of the distance
transform. This allows to associate to know for each pixel which is
the nearest edge element, not just its distance, as exemplified by the
following figure:
References
[1] P. F. Felzenszwalb and D. P. Huttenlocher. Distance transforms of sampled functions. Technical report, Cornell University, 2004.