MORPHPROFILE - (Derivative) morphological profile by opening and/or closing.

Contents

Description

Compute the morphological profile, the derivative morphological profile by opening and closing (or both) and the morphological multiscale characteristics.

Syntax

   DMP = MORPHPROFILE(I);
   [DMP, Phi] = MORPHPROFILE(I, op, se);
   [DMP, Phi, se, MP] = MORPHPROFILE(I, op, se, s1[, s2]);

Input

I : input image of size (X,Y,C), with C>1 when I is multispectral.

Outputs

MP : (derivative of the) morphological profile.

Phi : morphological multi-scale characteristics.

References

[PB00] M. Pesaresi and J.A. Benediktsson: "Image segmentation based on the derivative of the morphological profile", in Mathematical Morphology and Its Applications to Image and Signal Processing, J. Goustsias et al. eds. Norwell (MA, USA), Kluwer, 2000. http://www.springerlink.com/content/k217533885154776/

[PB01] M. Pesaresi and J.A. Benediktsson: "A new approach for the morphological segmentation of high-resolution satellite imagery", IEEE Trans. Geosci. Remote Sens., 39(2):309-320, 2001. http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=905239

[SP02] P. Soille and M. Pesaresi: "Advances in mathematical morphology applied to geoscience and remote sensing", IEEE Trans. Geosci. Remote Sens., 40(9):2042-2055, 2002. http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=1046853

[Soille03] P. Soille: "Morphological Image Analysis - Principles and Applications", 2nd ed. Berlin (Germany), Springer-Verlag, 2003.

[BPA03] J.A. Benediktsson, M. Pesaresi and K. Arnason: "Classification and feature extraction for remote sensing images from urban areas based on morphological transformations", IEEE Trans. Geosci. Remote Sens., 41(9):1940-1949, 2003. http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=1232208

See also

Ressembles: WATERSHED, GRANULOMETRY, ASF. Requires: MORPHPROFILE_BASE.

Function implementation

function [MP, Phi, varargout] = morphprofile( I, varargin )

parsing parameters

if isempty(ver('images'))
    error('morphprofile:errortoolbox', 'Image Processing toolbox required');
end

error(nargchk(1, 16, nargin, 'struct'));
error(nargoutchk(1, 4, nargout, 'struct'));


if ~isnumeric(I)
    error('morphprofile:inputparameter','a matrix is required in input');
end

p = createParser('MORPHPROFILE');
p.addOptional('op', 'roc', @(x)ischar(x) && ...
    any(strcmpi(x,{'ro', 'ropen', 'rc', 'rclose', 'roc','rocmax', ...
    'o', 'open', 'c', 'close', 'oc', 'ocmax', ...
    'e', 'erode', 'd', 'dilate', 'ed', 'edmax'})));
p.addOptional('se', 'disk', @(x) (iscell(x) && strcmp(class(x{1}),'strel')) || ...
    (ischar(x) && any(strcmpi(x,{'disk','rectangle','square','diamond', ...
                'line','periodicline','arbitrary','octagon','pair'}))));
p.addParamValue('s1', 2:2:10, @(x)isnumeric(x));
p.addParamValue('s2', [], @(x)isnumeric(x));

% parse and validate all input arguments
p.parse(varargin{:});
p = getvarParser(p);

checking/setting variables

C = size(I,3);

if ischar(p.se)
    shape = p.se;
    N = length(p.s1);

    if ~iscell(p.s1),
        if any(strcmp(shape,{'disk'}))
            p.s1 = floor(p.s1/2);
        end
        p.s1 = num2cell(p.s1);
    end
    if ~iscell(p.s2),
        if isempty(p.s2)
            p.s2 = cell(N,1);
        else
            if isscalar(p.s2),  p.s2 = repmat(p.s2, 1, N);  end;
            p.s2 = num2cell(p.s2);
        end
    end

    p.se = cell(N,1);
    for i=1:N
        p.se{i} = flatstrel(shape, p.s1{i}, p.s2{i});
    end

end

main processing

if nargout==4
    [MP, Phi, varargout{2}] = morphprofile_base( I, p.op, p.se );
else
    [MP, Phi] = morphprofile_base( I, p.op, p.se );
end

if nargout>=3,  varargout{1} = p.se;  end

display

if p.disp

    if any(strcmp(p.op,{'ro','ropen'})),       p.op = 'open-by-rec';
    elseif any(strcmp(p.op,{'rc','rclose'})),  p.op = 'close-by-rec';
    elseif strcmp(p.op,'roc'),                 p.op = 'open- and close-by-rec';
    elseif strcmp(p.op,'rocmax'),              p.op = 'max(open-,close-by-rec)';
    elseif any(strcmp(p.op,{'o','open'})),     p.op = 'open';
    elseif any(strcmp(p.op,{'c','close'})),    p.op = 'close';
    elseif strcmp(p.op,'oc'),                  p.op = 'open-close';
    elseif strcmp(p.op,'ocmax'),               p.op = 'max(open,close)';
    elseif any(strcmp(p.op,{'e','erode'})),    p.op = 'erosion';
    elseif any(strcmp(p.op,{'d''dilate'})),    p.op = 'dilation';
    elseif strcmp(p.op,'ed'),                  p.op = 'erosion-dilation';
    elseif strcmp(p.op,'edmax'),               p.op = 'max(erosion,dilation)';
    end

    N = length(MP);
    if any(strcmp(p.op,{'roc','oc','ed'})),  N = N/2;  end
    figure; ndisp = 3; mdisp = ceil(N/ndisp);
    for i=1:N
        subplot(mdisp, ndisp, i),  imagesc(rescale(MP{i})), axis image off;
    end
    if C==1,  colormap gray; end
    if any(strcmp(p.op,{'roc','oc','ed'}))
        figure
        for i=1:N
            subplot(mdisp, ndisp, i),  imagesc(rescale(MP{2*N-i+1})), axis image off;
        end
        if C==1,  colormap gray; end
    else
        suptitle(['DMP of ' p.op]);
    end
    figure, imagesc(rescale(Phi)), axis image off, colormap gray,
    title('morphological multi-scale characteristics');
end
end % end of morphprofile