Mercurial > forge
changeset 11328:aea0323c168e octave-forge
strel: implement decomposition for squares and rectangles
author | carandraug |
---|---|
date | Wed, 26 Dec 2012 02:56:41 +0000 |
parents | b80653f7ece7 |
children | 59bf625c1e8a |
files | main/image/inst/@strel/getsequence.m main/image/inst/@strel/strel.m |
diffstat | 2 files changed, 24 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/main/image/inst/@strel/getsequence.m Wed Dec 26 02:31:19 2012 +0000 +++ b/main/image/inst/@strel/getsequence.m Wed Dec 26 02:56:41 2012 +0000 @@ -14,23 +14,27 @@ ## this program; if not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {@var{SEQ} =} getsequence (@var{SE}) -## The sequence of decomposed structuring elements of SE. +## @deftypefn {Function File} {@var{seq} =} getsequence (@var{se}) +## Decompose structuring element. +## +## Returns a cell array of @code{strel} objects that compose @var{se}. ## ## @seealso{imdilate, imerode, strel} ## @end deftypefn function seq = getsequence (se) - ## We can do this in 2 ways: - ## 1. calculate this when creating the object and this only returns it - ## 2. have strel keep the options and calculate the sequence (and store it ) - ## only if requested (probably this is better) if (isempty (se.seq)) - ## this is just a sequence of SEs that can be used instead of a larger one, - ## so it's still valid to have a single element same as nhood. While we - ## don't implement this properly... - se.seq{1} = se; + switch (se.shape) + case "rectangle" + se.seq{1} = strel ("arbitrary", true (se.opt.dimensions(1), 1)); + se.seq{2} = strel ("arbitrary", true (1, se.opt.dimensions(2))); + case "square" + se.seq{1} = strel ("arbitrary", true (se.opt.edge, 1)); + se.seq{2} = strel ("arbitrary", true (1, se.opt.edge)); + otherwise + se.seq{1} = se; + endswitch endif seq = se.seq;
--- a/main/image/inst/@strel/strel.m Wed Dec 26 02:31:19 2012 +0000 +++ b/main/image/inst/@strel/strel.m Wed Dec 26 02:56:41 2012 +0000 @@ -63,6 +63,7 @@ SE.flat = true; SE.height = []; SE.seq = cell; + SE.opt = struct; switch (SE.shape) case "arbitrary" @@ -174,30 +175,32 @@ case "rectangle" if (numel (varargin) == 1) - dimensions = varargin{1}; + SE.opt.dimensions = varargin{1}; else error ("strel: no DIMENSIONS specified for rectangle shape"); endif - if (! ismatrix (dimensions) || numel (dimensions) != 2 || ! isnumeric (dimensions)) + if (! ismatrix (SE.opt.dimensions) || numel (SE.opt.dimensions) != 2 || + ! isnumeric (SE.opt.dimensions)) error ("strel: DIMENSIONS must be a 2 element vector"); - elseif (! is_positive_integer (dimensions(1)) || ! is_positive_integer (dimensions(2))) + elseif (! is_positive_integer (SE.opt.dimensions(1)) || + ! is_positive_integer (SE.opt.dimensions(2))) error ("strel: DIMENSIONS values must be positive integers"); endif - SE.nhood = true (dimensions); + SE.nhood = true (SE.opt.dimensions); SE.flat = true; case "square" if (numel (varargin) == 1) - edge = varargin{1}; + SE.opt.edge = varargin{1}; else error ("strel: no EDGE specified for square shape"); endif - if (! is_positive_integer (edge)) + if (! is_positive_integer (SE.opt.edge)) error ("strel: EDGE value must be positive integers"); endif - SE.nhood = true (edge); + SE.nhood = true (SE.opt.edge); SE.flat = true; otherwise