From 14687d05109268deca0fa2254e89446f1448547f Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Thu, 17 Oct 2013 13:07:41 +0200 Subject: [PATCH] Dictionary interface to preserve backward compatibility for RegionProps. --- skimage/measure/_regionprops.py | 23 ++++++++++++++++++++--- skimage/measure/tests/test_regionprops.py | 12 +++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 839a9965..798e04cc 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -4,6 +4,8 @@ from math import sqrt, atan2, pi as PI import numpy as np from scipy import ndimage +from collections import MutableMapping + from skimage.morphology import convex_hull_image, label from skimage.measure import _moments @@ -103,15 +105,16 @@ class _cached_property(object): return value -class _RegionProperties(object): +class _RegionProperties(MutableMapping): def __init__(self, slice, label, label_image, intensity_image, - cache_active): + cache_active, properties=None): self.label = label self._slice = slice self._label_image = label_image self._intensity_image = intensity_image self._cache_active = cache_active + self._properties = properties @_cached_property def area(self): @@ -301,6 +304,20 @@ class _RegionProperties(object): def weighted_moments_normalized(self): return _moments.moments_normalized(self.weighted_moments_central, 3) + + # Preserve dictionary interface + def __delitem__(self, key): + pass + + def __len__(self): + return len(self._properties or PROPS.values()) + + def __setitem__(self, key, value): + raise RuntimeError("Cannot assign region properties.") + + def __iter__(self): + return iter(self._properties or PROPS.values()) + def __getitem__(self, key): value = getattr(self, key, None) if value is not None: @@ -489,7 +506,7 @@ def regionprops(label_image, properties=None, label = i + 1 props = _RegionProperties(sl, label, label_image, - intensity_image, cache) + intensity_image, cache, properties=properties) regions.append(props) return regions diff --git a/skimage/measure/tests/test_regionprops.py b/skimage/measure/tests/test_regionprops.py index bf259167..13a3511b 100644 --- a/skimage/measure/tests/test_regionprops.py +++ b/skimage/measure/tests/test_regionprops.py @@ -1,5 +1,5 @@ from numpy.testing import assert_array_equal, assert_almost_equal, \ - assert_array_almost_equal, assert_raises + assert_array_almost_equal, assert_raises, assert_equal import numpy as np import math @@ -336,6 +336,16 @@ def test_weighted_moments_normalized(): assert_array_almost_equal(wnu, ref) +def test_old_dict_interface(): + feats = regionprops(SAMPLE, + ['Area', 'Eccentricity', 'EulerNumber', + 'Extent', 'MinIntensity', 'MeanIntensity', + 'MaxIntensity', 'Solidity'], + intensity_image=INTENSITY_SAMPLE) + np.array([props.values() for props in feats], np.float) + assert_equal(len(feats[0]), 8) + + if __name__ == "__main__": from numpy.testing import run_module_suite run_module_suite()