diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 5817580d..06840238 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -56,6 +56,8 @@ PROPS = { 'WeightedNormalizedMoments': 'weighted_moments_normalized' } +PROP_VALS = PROPS.values() + class _cached_property(object): """Decorator to use a function as a cached property. @@ -327,6 +329,20 @@ class _RegionProperties(MutableMapping): category=DeprecationWarning) return getattr(self, PROPS[key]) + def __eq__(self, other): + if not isinstance(other, _RegionProperties): + return False + + for key in PROP_VALS: + try: + #so that NaNs are equal + np.testing.assert_equal(getattr(self, key, None), + getattr(other, key, None)) + except AssertionError: + return False + + return True + def regionprops(label_image, properties=None, intensity_image=None, cache=True): diff --git a/skimage/measure/tests/test_regionprops.py b/skimage/measure/tests/test_regionprops.py index 42926499..b3d2c505 100644 --- a/skimage/measure/tests/test_regionprops.py +++ b/skimage/measure/tests/test_regionprops.py @@ -371,6 +371,22 @@ def test_invalid(): assert_raises(AttributeError, get_intensity_image) +def test_equals(): + arr = np.zeros((100, 100), dtype=np.int) + arr[0:25, 0:25] = 1 + arr[50:99, 50:99] = 2 + + regions = regionprops(arr) + r1 = regions[0] + + regions = regionprops(arr) + r2 = regions[0] + r3 = regions[1] + + assert_equal(r1 == r2, True, "Same regionprops are not equal") + assert_equal(r1 != r3, True, "Different regionprops are equal") + + if __name__ == "__main__": from numpy.testing import run_module_suite run_module_suite()