From 52594d0bd8b9a6f0e5f5d2d43af77560ce40c57c Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Thu, 5 Nov 2015 15:39:16 -0800 Subject: [PATCH 1/2] Only iterate over available region properties --- skimage/measure/_regionprops.py | 32 ++++++++++++++++++++--- skimage/measure/tests/test_regionprops.py | 10 +++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 1655ec61..9a9c1c00 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -53,7 +53,7 @@ PROPS = { 'WeightedNormalizedMoments': 'weighted_moments_normalized' } -PROP_VALS = PROPS.values() +PROP_VALS = set(PROPS.values()) class _cached_property(object): @@ -105,6 +105,9 @@ class _cached_property(object): class _RegionProperties(object): + """Please refer to `skimage.measure.regionprops` for more information + on the available region properties. + """ def __init__(self, slice, label, label_image, intensity_image, cache_active): @@ -301,7 +304,23 @@ class _RegionProperties(object): return _moments.moments_normalized(self.weighted_moments_central, 3) def __iter__(self): - return iter(PROPS.values()) + props = PROP_VALS + + if self._intensity_image is None: + unavailable_props = ('intensity_image', + 'max_intensity', + 'mean_intensity', + 'min_intensity', + 'weighted_moments', + 'weighted_moments_central', + 'weighted_centroid', + 'weighted_local_centroid', + 'weighted_moments_hu', + 'weighted_moments_normalized') + + props = props.difference(unavailable_props) + + return iter(sorted(props)) def __getitem__(self, key): value = getattr(self, key, None) @@ -457,7 +476,12 @@ def regionprops(label_image, intensity_image=None, cache=True): wnu_ji = wmu_ji / wm_00^[(i+j)/2 + 1] - where `wm_00` is the zeroth spatial moment (intensity-weighted area). + where ``wm_00`` is the zeroth spatial moment (intensity-weighted area). + + Each region also supports iteration, so that you can do:: + + for prop in region: + print(prop, region[prop]) References ---------- @@ -473,7 +497,7 @@ def regionprops(label_image, intensity_image=None, cache=True): Examples -------- >>> from skimage import data, util - >>> from skimage.morphology import label + >>> from skimage.measure import label >>> img = util.img_as_ubyte(data.coins()) > 110 >>> label_img = label(img, connectivity=img.ndim) >>> props = regionprops(label_img) diff --git a/skimage/measure/tests/test_regionprops.py b/skimage/measure/tests/test_regionprops.py index 514b84d3..2c064454 100644 --- a/skimage/measure/tests/test_regionprops.py +++ b/skimage/measure/tests/test_regionprops.py @@ -379,6 +379,16 @@ def test_equals(): assert_equal(r1 != r3, True, "Different regionprops are equal") +def test_iterate_all_props(): + region = regionprops(SAMPLE)[0] + p0 = {p: region[p] for p in region} + + region = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE)[0] + p1 = {p: region[p] for p in region} + + assert len(p0) < len(p1) + + if __name__ == "__main__": from numpy.testing import run_module_suite run_module_suite() From ba683069974b26e06c42f4f97cfc92253e70a774 Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Mon, 9 Nov 2015 09:40:16 -0800 Subject: [PATCH 2/2] Remove dict comprehension for Python 2.6 compatibility --- skimage/measure/tests/test_regionprops.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skimage/measure/tests/test_regionprops.py b/skimage/measure/tests/test_regionprops.py index 2c064454..6aa53ee6 100644 --- a/skimage/measure/tests/test_regionprops.py +++ b/skimage/measure/tests/test_regionprops.py @@ -381,10 +381,10 @@ def test_equals(): def test_iterate_all_props(): region = regionprops(SAMPLE)[0] - p0 = {p: region[p] for p in region} + p0 = dict((p, region[p]) for p in region) region = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE)[0] - p1 = {p: region[p] for p in region} + p1 = dict((p, region[p]) for p in region) assert len(p0) < len(p1)