changeset 770:577f260755b4

strel: implement hypercube and hyperrectangle shapes. * @strel/strel.m: implement the hypercube and hyperrectangle shapes. * @strel/getsequence.m: implement SE decomposition for the new shapes. Generalize with the square, cube, and rectangle shapes.
author Carnë Draug <carandraug@octave.org>
date Tue, 23 Jul 2013 05:30:57 +0100
parents c82d1a141903
children b2e168a18d4b
files inst/@strel/getsequence.m inst/@strel/strel.m
diffstat 2 files changed, 51 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/inst/@strel/getsequence.m
+++ b/inst/@strel/getsequence.m
@@ -27,16 +27,14 @@
 
   if (isempty (se.seq))
     switch (se.shape)
-      case "cube"
-        se.seq{1,1} = strel ("arbitrary", true (se.opt.edge, 1));
-        se.seq{2,1} = strel ("arbitrary", true (1, se.opt.edge));
-        se.seq{3,1} = strel ("arbitrary", true (1, 1, se.opt.edge));
-      case "rectangle"
-        se.seq{1,1} = strel ("arbitrary", true (se.opt.dimensions(1), 1));
-        se.seq{2,1} = strel ("arbitrary", true (1, se.opt.dimensions(2)));
-      case "square"
-        se.seq{1,1} = strel ("arbitrary", true (se.opt.edge, 1));
-        se.seq{2,1} = strel ("arbitrary", true (1, se.opt.edge));
+      case {"square", "cube", "hypercube", "rectangle", "hyperrectangle"}
+        nd = ndims (se.nhood);
+        for idx = 1:nd
+          vec_size      = ones (1, nd);
+          vec_size(idx) = size (se.nhood, idx);
+          se.seq{idx}   = strel ("arbitrary", true (vec_size));
+        endfor
+
       otherwise
         se.seq{1,1} = se;
     endswitch
--- a/inst/@strel/strel.m
+++ b/inst/@strel/strel.m
@@ -64,6 +64,16 @@
 ## Create disk shaped flat structuring element.  @var{radius} must be a positive
 ## integer.
 ##
+## @deftypefnx {Function File} {} strel ("hypercube", @var{n}, @var{edge})
+## Create @var{n} dimensional cube (n-cube) shaped @var{flat} structuring
+## element.  @var{edge} must be a positive integer that specifies the length
+## of its edges.
+##
+## @deftypefnx {Function File} {} strel ("hyperrectangle", @var{dimensions})
+## Create @var{n} dimensional hyperrectangle (or orthotope) shaped flat
+## structuring element.  @var{dimensions} must be a vector of positive
+## integers with its lengtht at each of the dimensions.
+
 ## @deftypefnx {Function File} {} strel ("line", @var{len}, @var{deg})
 ## Create line shaped flat structuring element.  @var{len} must be a positive
 ## real number.  @var{deg} must be a 1 or 2 elements real number, for a line in
@@ -77,7 +87,7 @@
 ## the octagon.
 ##
 ## @deftypefnx {Function File} {} strel ("pair", @var{offset})
-## Creates a flat structuring element with two members.  One member is placed
+## Create flat structuring element with two members.  One member is placed
 ## at the origin while the other is placed with @var{offset} in relation to the
 ## origin.  @var{offset} must then be a 2 element vector for the coordinates.
 ##
@@ -89,7 +99,7 @@
 ##   Therefore @var{v} must be a 2 element vector for the coordinates.
 ##
 ## @deftypefnx {Function File} {} strel ("rectangle", @var{dimensions})
-## Creates a rectangular shaped flat structuring element.  @var{dimensions} must
+## Create rectangular shaped flat structuring element.  @var{dimensions} must
 ## be a two element vector of positive integers with the number of rows and
 ## columns of the rectangle.
 ##
@@ -228,6 +238,37 @@
       SE.nhood = fspecial ("disk", radius) > 0;
       SE.flat  = true;
 
+    case "hypercube"
+      if (numel (varargin) == 2)
+        SE.opt.n    = varargin{1};
+        SE.opt.edge = varargin{2};
+      else
+        error ("strel: an hypercube shape needs 2 arguments");
+      endif
+      if (! is_positive_integer (SE.opt.n))
+        error ("strel: N value must be a positive integer");
+      elseif (! is_positive_integer (SE.opt.edge))
+        error ("strel: EDGE value must be a positive integer");
+      endif
+
+      SE.nhood = true (repmat (SE.opt.edge, 1, SE.opt.n));
+      SE.flat  = true;
+
+    case "hyperrectangle"
+      if (numel (varargin) == 1)
+        SE.opt.dimensions = varargin{1};
+      else
+        error ("strel: no DIMENSIONS specified for rectangle shape");
+      endif
+      if (! isnumeric (SE.opt.dimensions))
+        error ("strel: DIMENSIONS must be a 2 element vector");
+      elseif (! all (arrayfun (@is_positive_integer, SE.opt.dimensions(:))))
+        error ("strel: DIMENSIONS values must be positive integers");
+      endif
+
+      SE.nhood = true (SE.opt.dimensions(:));
+      SE.flat  = true;
+
     case "line"
       if (numel (varargin) == 2)
         linelen = varargin{1};