function SE = strel(varargin) % % Function File: SE = strel(shape, parameters); % % Inputs: shape = 'diamond', 'octagon', 'pair', 'rectangle', 'square', 'line', % 'periodicline', 'ball', 'arbitrary', 'disk' % parameters = tuning for shape selected (NYI - not yet implemented) % "diamond" - R = integer radius greater than 0 % "octagon" - NYI % "pair" - OFFSET = integer 2-element array [X Y] % "rectangle" - DIMENSION = 2 greater than 0 integer array [M N] % "square" - EDGE = integer edge greater than 0 % "line" - NYI % "periodicline" - NYI % "ball" - NYI % "arbitrary" - NYI % "disk" - R = integer radius greater than 0 % - N = use 0, 4, 6 or 8 periodic lines (default 0) (NYI) % (default will be 4, for now 0: it works 'slower') % % Output: SE = structure element as logical array % % Copyright (C) Roberto Metere. All rights reserved. % License: GPLv3 version = '0.5.1'; author = 'Roberto Metere'; bugreport = 'address@hidden'; % ------------------------------------ % Two arguments as minimum if (nargin == 0) usage = [' -- Function File: SE = strel(shape, parameters)' "\n\n"]; usage = [usage " shape = 'diamond', 'octagon', 'pair', 'rectangle', 'square', 'line', \n"]; usage = [usage " 'periodicline', 'ball', 'arbitrary', 'disk'\n\n"]; usage = [usage ' parameters (NYI - not yet implemented)' "\n"]; usage = [usage ' "diamond" - R = integer radius greater than 0' "\n"]; usage = [usage ' "octagon" - NYI' "\n"]; usage = [usage ' "pair" - OFFSET = integer 2-element array [X Y]' "\n"]; usage = [usage ' "rectangle" - DIMENSION = 2 greater than 0 integer array [M N]' "\n"]; usage = [usage ' "square" - EDGE = integer edge greater than 0' "\n"]; usage = [usage ' "line" - NYI' "\n"]; usage = [usage ' "periodicline" - NYI' "\n"]; usage = [usage ' "ball" - NYI' "\n"]; usage = [usage ' "arbitrary" - NYI' "\n"]; usage = [usage ' "disk" - R = integer radius greater than 0' "\n"]; usage = [usage ' - N = use 0, 4, 6 or 8 periodic lines (default 4) (NYI)' "\n"]; help strel error(['Invalid call to strel version ' version '. Correct usage is:' "\n\n" usage "\n\n"]); else % get only shape for now shape = varargin{1}; end % Not yet implemented, sorry switch (shape) case {'octagon', 'line', 'periodicline', 'ball', 'arbitrary'} error(['Shape "' shape '" not yet implemented']); otherwise % Just for completeness end % Get other parameters switch (shape) case {'diamond', 'octagon', 'pair', 'rectangle', 'square'} if (nargin == 2) arg1 = varargin{nargin}; else error(['Shape "' shape '" needs (at least) 1 parameter']); end case {'line', 'periodicline'} if (nargin == 3) arg1 = varargin{nargin - 1}; arg2 = varargin{nargin}; else error(['Shape "' shape '" needs (at least) 2 parameters']); end case 'ball' if (nargin == 4) arg1 = varargin{nargin - 2}; arg2 = varargin{nargin - 1}; arg3 = varargin{nargin}; else error(['Shape "' shape '" needs (at least) 3 parameters']); end case {'arbitrary', 'disk'} if (nargin == 2) arg1 = varargin{nargin}; else if (nargin == 3) arg1 = varargin{nargin - 1}; arg2 = varargin{nargin}; else error('strel'); end end otherwise error(['Unknown shape "' shape '"']); end % Compute structure element switch (shape) case 'square' if (size(arg1) == [1 1]) if ((arg1 == uint8(arg1)) && isnumeric(arg1)) if (arg1 > 0) arg1 = uint8(arg1); SE = ones(arg1, arg1, 'logical'); else error(['Square edge must be a positive integer']); end else error(['Square edge must be a number']); end else error(['Square edge must be a positive integer']); end case 'rectangle' if ((arg1 == uint8(arg1)) && isnumeric(arg1)) if ((size(arg1) == [1 2]) || (size(arg1) == [2 1])); if ((arg1(1) >= 0) && (arg1(2) >= 0)) SE = ones(arg1(1), arg1(2), 'logical'); else error(['Only positive value for rectangle dimensions allowed']); end else error(['Rectangle dimensions must be exactly a 2-integer array']); end else error(['Rectangle dimensions must be a 2-integer array']); end case 'diamond' if (size(arg1) == [1 1]) if ((arg1 == uint8(arg1)) && isnumeric(arg1)) if (arg1 > 0) n = int32(2*arg1 + 1); c = (n + 1)/2; SE = zeros([n n], 'logical'); for i = 1:n m = n - abs(2*(i - c)); for j = c - m/2 + 1:c + m/2 - 1 SE(i, j) = 1; end end else error(['The parameter must be greater than 0']); end else error(['The parameter must be an integer']); end else error(['The parameter must be an integer']); end case 'pair' if ((arg1 == int8(arg1)) && isnumeric(arg1)) if ((size(arg1) == [1 2]) || (size(arg1) == [2 1])); m = abs(2*arg1(1)) + 1; n = abs(2*arg1(2)) + 1; cy = (m + 1)/2; cx = (n + 1)/2; SE = zeros([m n], 'logical'); SE(cy, cx) = 1; SE(cy + arg1(1), cx + arg1(2) ) = 1; else error(['Offset must be a 2-integer array']); end else error(['Offset must be a numeric array']); end case 'disk' if (size(arg1) == [1 1]) % Default value of N if (nargin <= 2) arg2 = 4; else warning(['Shape "' shape '" still ignores second argument (partially implemented)']); end if (size(arg2) == [1 1]) if (arg1 > 0) switch (arg2) case {0, 4, 6, 8} radius = arg1; n = 2*radius + 1; radius2 = radius*radius; SE = zeros([n n], 'logical'); for i = 1:n for j = 1:n pitagora = (i - int32(radius) - 1)^2 + (j - int32(radius) - 1)^2; if (pitagora <= radius2) SE(i, j) = 1; end end end otherwise error(['Number of periodic lines structuring elements may assume only values: 0, 4, 6 or 8.']); end else error(['Radius must be a strictly positive integer']); end else error(['Number of periodic lines structuring elements must be an integer']); end else error(['Radius must be an integer']); end otherwise error(['Bug: execution should never reach this line. Please report this bug to ' author ' <' bugreport '>']); end