FMMANISOPROPAGATION - Anisotropic propagation through Fast Marching in 2D.
Contents
Description
Perform anisotropic Fast Marching following the approach developped in [SKDCCRRA07,BPC08,PC09] and using the implementation of [GCM] as suggested in [PLPWDFS06a,PLPWDFS06b].
Syntax
D = FMMANISOPROPAGATION(W, start_pts, L); [D, V] = FMMANISOPROPAGATION(W, start_pts, method, L, niter);
Inputs
W : cost function; it should be a (m,n,2) (for 2D vector field) or a (m,n,2,2) (for tensor field) weight matrix.
start_pts : a (2,k) matrix where k is the number of starting points.
end_pts : a (2,l) matrix where l is the number of ending points; the FMM propagation stops when these points are reached.
method : logical boolean used for selecting the method: true for using FMMANISOPROPAGATION_MEX and false for using FM2DANISO_MEX.
L : optional constraint map used when method=true to reduce the set of explored points, as only points with current distance smaller than their values in L will be visited; set entries to -Inf in L if you do not want points to be visited by FMM; default: L=Inf, ie. all points are visited.
niter : maximum number of iterations; default: niter=Inf.
Outputs
D : a 2D array containing the value of the distance function to seed.
V : optional variable returned when method=true; index of the closest point from the set of starting points (0 for points which have not been reached); V provide a Voronoi decomposition of the domain.
Remark
If the Voronoi diagram V is desired in output (see above), the function FM2DANISO_MEX should be called, hence the option method should be set to false.
References
[PLPWDFS06a] E. Prados, C. Lenglet, J. Pons, N. Wotawa, R. Deriche, O. Faugeras, S. Soatto: "Control theory and fast marching methods for brain connectivity mapping", INRIA Research Report 5845, 2006.
[PLPWDFS06b] E. Prados, C. Lenglet, J. Pons, N. Wotawa, R. Deriche, O. Faugeras, S. Soatto: "Control theory and fast marching methods for brain connectivity mapping", Proc. IEEE CVPR, pp. 1076?1083, 2006.
[SKDCCRRA07] M. Sermesant, E. Konukoglu, H. Delingette, Y. Coudiere, P. Chinchapatnam, K. Rhode, R. Razavi and N. Ayache: "An anisotropic multi-front fast marching method for real-time simulation of cardiac electrophysiology, Proc. FIMH, LNCS 4466, pp. 160-169, 2007,
[BPC08] S. Bougleux, G. Peyre, and L. Cohen: "Anisotropic geodesics for perceptual grouping and domain meshing", Proc. ECCV, vol. 2, pp. 129-142, 2008.
[PC09] G. Peyre, and L. Cohen: "Geodesic methods for shape and surface processing", in "Advances in Computational Vision and Medical Image Processing: Methods and Applications", vol. 13 of "Computational Methods in Applied Sciences", pp. 29-56, Springer, 2009.
[PFMM] Peyre 's toolbox on FMM available at https://www.ceremade.dauphine.fr/~peyre/matlab/fast-marching/content.html
[GCM] See GCM - Geodesic Connectivity Mapping source code available at http://gcm.gforge.inria.fr/GCM-Publications.html
See also
Ressembles: FMM, FMM_BASE, FMMISOPROPAGATION, DIJKSTRAPROPAGATION, POTENTIAL2FRONT, IM2FRONT_BASE. Requires: IM2POTENTIAL, FMMANISOPROPAGATION_MEX, FM2DANISO_MEX.
Function implementation
function [D, V] = fmmanisopropagation(W, start_pts, method, L, niter)
% we allow variable number of inputs if nargin <=4, niter = Inf; if nargin<=3, L = []; if nargin<=2, method = true; end end end % ensure this outside the function % if size(start_pts,1)~=2 % error('fmmanisopropagation:inputerror', ... % 'seed points should be (2 x k) dimensional'); % end
check/set the input tensor field used for anisotropic propagation via FMM
d = nb_dims(W); m = size(W,1); n = size(W,2); if d==2 % a scalar field has been passed: use isotropic FMM instead warning('fmmanisopropagation:inputwarning', ... 'use isotropic FMM approach with scalar cost field'); % W = gstfeature(W(:,:,1,1),W(:,:,2,2),W(:,:,1,2),'norm'); % TODO: rather call isotropic FMM with FMMISOPROPAGATION return; elseif d==3 % a vector field has been passed V = cat(3, -W(:,:,2), W(:,:,1)); % orthogonal vector W = gstdecomp(W, V, ones(m,n), ones(m,n) ); elseif d~=4 % all other cases: hope not to reach this point error('fmmanisopropagation:inputerror', ... 'input cost function should be a vector of a tensor field'); end
!!! The following code runs with square matrices (ie. size(w,1)==size(w,2)), therefore we have to transform the input !!!
if m~=n M = max([m n]); W = padarray(W, [M-m M-n], 1, 'post'); else M = m; end pad = 0; % pad = 1; if pad, W = padarray(W,[pad pad], 1, 'both'); end %#ok
launch the mex files
if method && exist('fmmanisopropagation_mex','file') % at that point, we should have d=4: W is a structure tensor field % in order to use fmmanisopropagation_mex (see [GCM] source code), we % need to inject the 2D space into a 3D space % % practical issue: how to deal with null tensor % [l1, l2, e1, e2] = gstdecomp(W); % I = l1==0; % l1(I) = 1e-9; % eps for C implementation % % l2(I) = 0; % % v = e1(:,:,1); v(I) = 1; e1(:,:,1) = v; % % v = e1(:,:,2); v(I) = 0; e1(:,:,2) = v; % % v = e2(:,:,1); v(I) = 0; e2(:,:,1) = v; % % v = e2(:,:,2); v(I) = 1; e2(:,:,2) = v; % W = gstdecomp(l1, l2, e1, e2); if size(W,3)==2 && size(W,4)==2 % we transform the 2D vector field into a 3D field W1 = zeros(M+2*pad, M+2*pad, 3, 3); W1(:,:,1:2,1:2) = W; W1(:,:,3,3) = 1; W = reshape(W1, [M+2*pad M+2*pad, 1 3 3]); % convert to correct size W = cat(4, W(:,:,:,1,1), W(:,:,:,1,2), W(:,:,:,1,3), ... W(:,:,:,2,2), W(:,:,:,2,3), W(:,:,:,3,3) ); end % padd to avoid boundary problem W = cat(1, W(1,:,:,:), W, W(end,:,:,:)); W = cat(2, W(:,1,:,:), W, W(:,end,:,:)); W = cat(3, W(:,:,1,:), W, W(:,:,end,:)); % prepare the set of points start_pts(end+1,:) = 1; % we represent the point in a 3D space % launch the anisotropic FMM % start_pts = start_pts-1; if isempty(L), L = Inf(size(W,1), size(W,2), 3); % ones end % if pad, L = padarray(L, [pad pad], -Inf, 'both'); end alpha = 0; % euclidean norm: see source code [GCM], functions % AnisotropicTensorDistanceConfidence.h and AnisotropicTensorDistance.h [D, V] = fmmanisopropagation_mex(W, L, alpha, start_pts, niter); % remove boundary problems D = D(2:end-1, 2:end-1, 2); if sum(V(:))==0, V = []; % no Voronoi output... problem here!!! else V = V(2:end-1, 2:end-1, 2); end elseif ~method && exist('fm2daniso_mex','file') step = [1; 1]; % step = [1/size(W,1), 1/size(W,2)]; [D, ~, ~, V] = fm2daniso_mex(step, W, start_pts); else % hope not to reach this point either error('fmmanisopropagation:libraryerror',... 'method fmmanisopropagation not available'); end
the final touch...
if pad % get rid of the boundary pad D = D(1+pad:end-pad, 1+pad:end-pad); %#ok end if m~=n % get rid of the dimension pad: finally reset to the correct size D = D(1:m,1:n); if ~isempty(V), V = V(1:m,1:n); end end % reset to Matlab Inf values D(D>1e16) = Inf;
end % end of fmmanisopropagation