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"}