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