IM2AMOEBA_BASE - Base function for IM2AMOEBA.
Contents
Syntax
[D, Q] = IM2AMOEBA_BASE(I, start_pts, dfeat, lambda, dspace);
See also
Ressembles: IM2AMOEBA, DIJKSTRA_BASE, DIJK, POTENTIAL2FRONT, FMM_BASE. Requires: DIJKADVANCED, IXNEIGHBOURS, SPARSE.
Function implementation
function [D, Q] = im2amoeba_base(I, start_pts, dfeat, lambda, dspace)
define internal parameters
pad = 0; % pad = 1; % I = padarray(I,[1 1 0], 'replicate', 'both'); [X,Y,C] = size(I); XY = X*Y; Q = zeros(X,Y); Q = Q(:); D = Inf(X,Y); D = D(:);
main calculation over seed points
for i=1:size(start_pts,2) start = sub2ind([X,Y], start_pts(1,i)+pad, start_pts(2,i)+pad); % end_pts = []; % end_pts = [1:X, X*(1:Y-2)+1, X*(2:Y-1), (1:X)+X*(Y-1)]; % note that if used with DIJKSTRAPROPAGATION, end_pts must be a row % vector % end_pts = XY; [ic,icd] = ixneighbours(I(:,:,1), [], 8); % ic = unique(sort([ic icd], 2), 'rows') % icd = ic(:,2); ic = ic(:,1); nrc = numel(ic); ind = repmat(XY,[nrc, 1]) * (0:C-1); IC = repmat(ic, [1 C]) + ind; ICD = repmat(icd, [1 C]) + ind; W = lambda * dfeat(I(IC),I(ICD)); [x,y] = ind2sub([X,Y],ic); [IC,ICD] = ind2sub([X,Y],icd); W = W + dspace([x y], [IC ICD]); % construct a sparse adjacency matrix G G = sparse(ic, icd, W, XY, XY); % % transform the input weight matrix and create an appropriate adjacency % % matrix for DIJKADVANCED % A = G>0; % adjacency matrix: connections are set to true % d = dijkadvanced(A, G, start); niter = 1.2 * XY^2; d = dijkstrapropagation_mex(G, start-1, -1, niter); [D, r] = min(cat(2, d(:), D), [], 2); Q(r==1) = i; end D = reshape(D, [X Y]); % D = D(1+pad:X-pad,1+pad:Y-pad); Q = reshape(Q, [X Y]);
end % end of im2amoeba