FINDIMPORTANTEXTREMA1D_BASE - Base function for FINDIMPORTANTEXTREMA1D.

Contents

Syntax

  [Extrema, Strict, Left, Right] = findimportantextrema1D_base(X, dist);

See also

Ressembles: FINDZEROEXTREMA1D_BASE, Requires: FINDZEROEXTREMA1D_BASE, BWCONNCOMP, REGIONPROPS, LABELMATRIX.

Function implementation

function [Extrema, Strict, Left, Right] = findimportantextrema1D_base(X, dist)

check/set parameters

switch dist
    % dist = @(a,b) abs(a-b) / max(abs(a),abs(b));
    case 'abs'
        dist = @(a,b) abs(a-b);

    case 'nabs'
        dist = @(a,b) abs(a-b) / (abs(a)+abs(b));
end

Extrema = zeros(size(X),2);

first identify the local (flat or strict) extrema

% function handle for finding (flat or strict) minima
Min = findzeroextrema1D_base(X(:), [], [], 'local3', [], [eps 0]); % [eps 0]
Extrema(Min(:,1),:) = [ones(size(Min,1),1) Min(:,2)];
% setting A = diff(CSP(1:end-1)) and B = diff(CSP(2:end)), we look for those
% edges verifying:
%    sign(A)-sign(B)<0 & min(abs([A B]),[],2)>=eps & max(abs([A B]),[],2)>0
[Strict,Left,Right] = importance(X(:), Min);

%   %----------------------------------------------------------------------
    function [strict,left,right] = importance (X, Mset)
        left = zeros(size(X));
        right = zeros(size(X));

        for v=unique(Mset(:,2))'
            % look at extrema with same level (ie. value)
            m = Mset(Mset(:,2)==v,1);
            CC = bwconncomp(X>v);  L = labelmatrix(CC);
            STATS = regionprops(CC, X, 'MaxIntensity');
            maxXval = cat(1, STATS.MaxIntensity);

            l = L(m-1); i = l~=0; l = l(i);
            left(m(i)) = dist(maxXval(l), v);
            left(m(~i)) = NaN;

            r = L(m+1); i = r~=0; r = r(i);
            right(m(i)) = dist(maxXval(r), v);
            right(m(~i)) = NaN;

        end
        strict = max([left right],[],2);

    end
%   %----------------------------------------------------------------------

ibid with max

Max = findzeroextrema1D_base(X(:), [], 'local3', [], [], [eps 0]); % [eps 0]
Extrema(Max(:,1),:) = [ones(size(Max,1),1) Max(:,2)];
Max(:,2) = max(X(:)) - Max(:,2);
[strict,left,right] = importance(max(X(:))-X(:), Max);
Left = Left + left;
Right = Right + right;
Strict = Strict + strict;

output

v = find(Extrema(:,1));  Extrema = [v Extrema(v,2)];
Strict = nonzeros(Strict);
Left = nonzeros(Left);
Right = nonzeros(Right);
end % end of findimportantextrema1D_base