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