regionprops does a bunch of things, most of which make sense for
N-dimensional images. I attach a proposed diff to address this. Can
anyone give me some review before I commit it?

TIA,
- Jordi G. H.
Index: regionprops.m
===================================================================
--- regionprops.m	(revision 10831)
+++ regionprops.m	(working copy)
@@ -96,10 +96,6 @@
     error ("regionprops: not enough input arguments");
   endif
   
-  if (!ismatrix (bw) || ndims (bw) != 2)
-    error ("regionprops: first input argument must be a NxM matrix");
-  endif
-
   if (numel (varargin) == 0)
     properties = "basic";
   elseif (numel (varargin) == 1 && iscellstr (varargin {1}))
@@ -113,12 +109,13 @@
   if (ischar (properties) && strcmpi (properties, "basic"))
     properties = {"Area", "Centroid", "BoundingBox"};
   elseif (ischar (properties) && strcmpi (properties, "all"))
-    properties = {"area", "eulernumber", "boundingbox", "extent", "perimeter", ...
-                  "centroid", "pixelidxlist", "filledarea", "pixellist",       ...
-                  "filledimage", "image", "maxintensity", "minintensity",      ...
+    properties = {"area", "eulernumber", "boundingbox", "extent", "perimeter",
+                  "centroid", "pixelidxlist", "filledarea", "pixellist",
+                  "filledimage", "image", "maxintensity", "minintensity",
                   "weightedcentroid", "meanintensity", "pixelvalues"};
   elseif (!iscellstr (properties))
-    error ("%s %s", "regionprops: properties must be specified as a list of",
+    error ("%s %s", "regionprops: properties must be specified as a \
+                                %list of",
            "strings or a cell array of strings");
   endif
 
@@ -127,7 +124,10 @@
     L = bw; # the image was already labelled
     num_labels = max (L (:));
   else
-    [L, num_labels] = bwlabel (bw);
+    if (ndims (bw) == 2)
+      [L, num_labels] = bwlabel (bw);
+    else
+      [L, num_labels] = bwlabeln (bw);
   endif
   
   ## Compute the properties
@@ -138,6 +138,9 @@
         for k = 1:num_labels
           retval (k).Area = local_area (L == k);
         endfor
+        if num_labels == 0
+          retval = struct("Area", {});
+        endif
         
       case {"eulernumber", "euler_number"}
         for k = 1:num_labels
@@ -163,8 +166,8 @@
 
       case "centroid"
         for k = 1:num_labels
-          [Y, X] = find (L == k);
-          retval (k).Centroid = [mean(X), mean(Y)];
+          C = cell2mat (nthargout (1:ndims(L), @find, L == k));
+          retval (k).Centroid = [mean(C)];
         endfor
 
       case {"pixelidxlist", "pixel_idx_list"}
@@ -179,8 +182,8 @@
 
       case {"pixellist", "pixel_list"}
         for k = 1:num_labels
-          [Y, X] = find (L == k);
-          retval (k).PixelList = [X, Y];
+          X = cell2mat (nthargout (1:ndims(bw), @find, L == k));
+          retval (k).PixelList = [X(2), X(1), X(3:)];
         endfor
 
       case {"filledimage", "filled_image"}
@@ -202,20 +205,21 @@
     
       case {"minintensity", "min_intensity"}
         for k = 1:num_labels
-          retval (k).MaxIntensity = min (bw (L == k) (:));
+          retval (k).MinIntensity = min (bw (L == k) (:));
         endfor
     
       case {"weightedcentroid", "weighted_centroid"}
         for k = 1:num_labels
-          [Y, X] = find (L == k);
+          C = cell2mat (nthargout(1:ndims(bw), @find, L == k));
           vals = bw (L == k) (:);
           vals /= sum (vals);
-          retval (k).WeightedCentroid = [dot(X, vals), dot(Y, vals)];
+          retval (k).WeightedCentroid = [dot(C(2), vals), dot(C(1)), vals),\
+              dot(C(3:end), repmat(vals, 1, length(C)-2)];
         endfor
 
       case {"meanintensity", "mean_intensity"}
         for k = 1:num_labels
-          retval (k).MaxIntensity = mean (bw (L == k) (:));
+          retval (k).MeanIntensity = mean (bw (L == k) (:));
         endfor
         
       case {"pixelvalues", "pixel_values"}
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Octave-dev mailing list
Octave-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/octave-dev

Reply via email to