From 12ba5905a7a2ca00058d747b6854e03bafc290a8 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 02:56:49 +0530 Subject: [PATCH 01/11] overrided __eq__ method of region props --- skimage/measure/_regionprops.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 5817580d..5de29ea2 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -23,14 +23,14 @@ PROPS = { 'CentralMoments': 'moments_central', 'Centroid': 'centroid', 'ConvexArea': 'convex_area', -# 'ConvexHull', + # 'ConvexHull', 'ConvexImage': 'convex_image', 'Coordinates': 'coords', 'Eccentricity': 'eccentricity', 'EquivDiameter': 'equivalent_diameter', 'EulerNumber': 'euler_number', 'Extent': 'extent', -# 'Extrema', + # 'Extrema', 'FilledArea': 'filled_area', 'FilledImage': 'filled_image', 'HuMoments': 'moments_hu', @@ -45,10 +45,10 @@ PROPS = { 'NormalizedMoments': 'moments_normalized', 'Orientation': 'orientation', 'Perimeter': 'perimeter', -# 'PixelIdxList', -# 'PixelList', + # 'PixelIdxList', + # 'PixelList', 'Solidity': 'solidity', -# 'SubarrayIdx' + # 'SubarrayIdx' 'WeightedCentralMoments': 'weighted_moments_central', 'WeightedCentroid': 'weighted_centroid', 'WeightedHuMoments': 'weighted_moments_hu', @@ -56,8 +56,11 @@ PROPS = { 'WeightedNormalizedMoments': 'weighted_moments_normalized' } +PROP_VALS = PROPS.values() + class _cached_property(object): + """Decorator to use a function as a cached property. The function is only called the first time and each successive call returns @@ -304,7 +307,6 @@ class _RegionProperties(MutableMapping): def weighted_moments_normalized(self): return _moments.moments_normalized(self.weighted_moments_central, 3) - # Preserve dictionary interface def __delitem__(self, key): pass @@ -327,6 +329,11 @@ class _RegionProperties(MutableMapping): category=DeprecationWarning) return getattr(self, PROPS[key]) + def __eq__(self, other): + attr1 = np.array([getattr(self, k, None)for k in PROP_VALS]) + attr2 = np.array([getattr(other, k, None)for k in PROP_VALS]) + return np.all(attr1 == attr2) + def regionprops(label_image, properties=None, intensity_image=None, cache=True): @@ -552,9 +559,8 @@ def perimeter(image, neighbourhood=4): perimeter_weights[[21, 33]] = sqrt(2) perimeter_weights[[13, 23]] = (1 + sqrt(2)) / 2 - perimeter_image = ndimage.convolve(border_image, np.array([[10, 2, 10], - [ 2, 1, 2], + [2, 1, 2], [10, 2, 10]]), mode='constant', cval=0) From a748df0b557048f5b71c5fe33840ac2c26bf8065 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 02:59:59 +0530 Subject: [PATCH 02/11] removed blankline --- skimage/measure/_regionprops.py | 1 - 1 file changed, 1 deletion(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 5de29ea2..9e2cb974 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -60,7 +60,6 @@ PROP_VALS = PROPS.values() class _cached_property(object): - """Decorator to use a function as a cached property. The function is only called the first time and each successive call returns From 77b91e633b7d01c8c3271851b210053f36ef2e6a Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 03:50:04 +0530 Subject: [PATCH 03/11] added tests, accounted for nan case --- skimage/measure/tests/test_regionprops.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/skimage/measure/tests/test_regionprops.py b/skimage/measure/tests/test_regionprops.py index 42926499..89525fa2 100644 --- a/skimage/measure/tests/test_regionprops.py +++ b/skimage/measure/tests/test_regionprops.py @@ -371,6 +371,11 @@ def test_invalid(): assert_raises(AttributeError, get_intensity_image) +def test_equals(): + r1 = regionprops(SAMPLE)[0] + r2 = regionprops(SAMPLE)[0] + assert r1 == r2 + if __name__ == "__main__": from numpy.testing import run_module_suite run_module_suite() From ace11b852e015b146b528b1c63789e6be9529451 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 03:50:24 +0530 Subject: [PATCH 04/11] added nan case --- skimage/measure/_regionprops.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 9e2cb974..eb560291 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -329,9 +329,20 @@ class _RegionProperties(MutableMapping): return getattr(self, PROPS[key]) def __eq__(self, other): + if not isinstance(other,_RegionProperties): + return False + attr1 = np.array([getattr(self, k, None)for k in PROP_VALS]) attr2 = np.array([getattr(other, k, None)for k in PROP_VALS]) - return np.all(attr1 == attr2) + + for x,y in zip(attr1, attr2): + try: + #so that NaNs are equal + np.testing.assert_equal(x,y) + except AssertionError : + return False + + return True def regionprops(label_image, properties=None, From ab06d0177b2504f839822f24d3b6d031fb8cc078 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 03:51:59 +0530 Subject: [PATCH 05/11] pep8 --- skimage/measure/_regionprops.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index eb560291..4e1750a5 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -329,17 +329,17 @@ class _RegionProperties(MutableMapping): return getattr(self, PROPS[key]) def __eq__(self, other): - if not isinstance(other,_RegionProperties): + if not isinstance(other, _RegionProperties): return False attr1 = np.array([getattr(self, k, None)for k in PROP_VALS]) attr2 = np.array([getattr(other, k, None)for k in PROP_VALS]) - for x,y in zip(attr1, attr2): + for x, y in zip(attr1, attr2): try: #so that NaNs are equal - np.testing.assert_equal(x,y) - except AssertionError : + np.testing.assert_equal(x, y) + except AssertionError: return False return True From dd8a14bf69f135be47b62344f99b8422e64400a7 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 03:55:22 +0530 Subject: [PATCH 06/11] reverted irrelevant changes: --- skimage/measure/_regionprops.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 4e1750a5..71da3c1a 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -23,14 +23,14 @@ PROPS = { 'CentralMoments': 'moments_central', 'Centroid': 'centroid', 'ConvexArea': 'convex_area', - # 'ConvexHull', +# 'ConvexHull', 'ConvexImage': 'convex_image', 'Coordinates': 'coords', 'Eccentricity': 'eccentricity', 'EquivDiameter': 'equivalent_diameter', 'EulerNumber': 'euler_number', 'Extent': 'extent', - # 'Extrema', +# 'Extrema', 'FilledArea': 'filled_area', 'FilledImage': 'filled_image', 'HuMoments': 'moments_hu', @@ -45,10 +45,10 @@ PROPS = { 'NormalizedMoments': 'moments_normalized', 'Orientation': 'orientation', 'Perimeter': 'perimeter', - # 'PixelIdxList', - # 'PixelList', +# 'PixelIdxList', +# 'PixelList', 'Solidity': 'solidity', - # 'SubarrayIdx' +# 'SubarrayIdx' 'WeightedCentralMoments': 'weighted_moments_central', 'WeightedCentroid': 'weighted_centroid', 'WeightedHuMoments': 'weighted_moments_hu', @@ -570,7 +570,7 @@ def perimeter(image, neighbourhood=4): perimeter_weights[[13, 23]] = (1 + sqrt(2)) / 2 perimeter_image = ndimage.convolve(border_image, np.array([[10, 2, 10], - [2, 1, 2], + [ 2, 1, 2], [10, 2, 10]]), mode='constant', cval=0) From b0dbfffb45bb164a2270ab0c6cdf9c6d0cdf50f7 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 03:56:40 +0530 Subject: [PATCH 07/11] reverted irrelevant changes --- skimage/measure/_regionprops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 71da3c1a..69710c87 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -570,7 +570,7 @@ def perimeter(image, neighbourhood=4): perimeter_weights[[13, 23]] = (1 + sqrt(2)) / 2 perimeter_image = ndimage.convolve(border_image, np.array([[10, 2, 10], - [ 2, 1, 2], + [ 2, 1, 2], [10, 2, 10]]), mode='constant', cval=0) From 1fc24294ff8470039c95847c1f4eba42508cfbd1 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 03:58:32 +0530 Subject: [PATCH 08/11] reverted irrelevant changes --- skimage/measure/_regionprops.py | 1 + 1 file changed, 1 insertion(+) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 69710c87..184a959f 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -569,6 +569,7 @@ def perimeter(image, neighbourhood=4): perimeter_weights[[21, 33]] = sqrt(2) perimeter_weights[[13, 23]] = (1 + sqrt(2)) / 2 + perimeter_image = ndimage.convolve(border_image, np.array([[10, 2, 10], [ 2, 1, 2], [10, 2, 10]]), From 3f5b3892ed769115a37ff589abcb4b74f387b47f Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Wed, 26 Mar 2014 03:59:56 +0530 Subject: [PATCH 09/11] reverted irrelevant changes --- skimage/measure/_regionprops.py | 1 + 1 file changed, 1 insertion(+) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 184a959f..48162723 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -306,6 +306,7 @@ class _RegionProperties(MutableMapping): def weighted_moments_normalized(self): return _moments.moments_normalized(self.weighted_moments_central, 3) + # Preserve dictionary interface def __delitem__(self, key): pass From 764c59693c65c2e685bc3b1913fb53dde7f56911 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Fri, 28 Mar 2014 00:12:18 +0530 Subject: [PATCH 10/11] removed array cast, added not equals test --- skimage/measure/_regionprops.py | 8 +++----- skimage/measure/tests/test_regionprops.py | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 48162723..4cc3dab5 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -333,13 +333,11 @@ class _RegionProperties(MutableMapping): if not isinstance(other, _RegionProperties): return False - attr1 = np.array([getattr(self, k, None)for k in PROP_VALS]) - attr2 = np.array([getattr(other, k, None)for k in PROP_VALS]) - - for x, y in zip(attr1, attr2): + for key in PROP_VALS: try: #so that NaNs are equal - np.testing.assert_equal(x, y) + np.testing.assert_equal( + getattr(self, key, None), getattr(other, key, None)) except AssertionError: return False diff --git a/skimage/measure/tests/test_regionprops.py b/skimage/measure/tests/test_regionprops.py index 89525fa2..eea71c5f 100644 --- a/skimage/measure/tests/test_regionprops.py +++ b/skimage/measure/tests/test_regionprops.py @@ -372,9 +372,20 @@ def test_invalid(): def test_equals(): - r1 = regionprops(SAMPLE)[0] - r2 = regionprops(SAMPLE)[0] + 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 r1 == r2 + assert r1 != r3 + if __name__ == "__main__": from numpy.testing import run_module_suite From e6ea9efa1c0b30eda938cab3983c390c93614554 Mon Sep 17 00:00:00 2001 From: Vighnesh Birodkar Date: Sun, 30 Mar 2014 17:46:45 +0530 Subject: [PATCH 11/11] formatting, used assert_equals in test --- skimage/measure/_regionprops.py | 4 ++-- skimage/measure/tests/test_regionprops.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/skimage/measure/_regionprops.py b/skimage/measure/_regionprops.py index 4cc3dab5..06840238 100644 --- a/skimage/measure/_regionprops.py +++ b/skimage/measure/_regionprops.py @@ -336,8 +336,8 @@ class _RegionProperties(MutableMapping): for key in PROP_VALS: try: #so that NaNs are equal - np.testing.assert_equal( - getattr(self, key, None), getattr(other, key, None)) + np.testing.assert_equal(getattr(self, key, None), + getattr(other, key, None)) except AssertionError: return False diff --git a/skimage/measure/tests/test_regionprops.py b/skimage/measure/tests/test_regionprops.py index eea71c5f..b3d2c505 100644 --- a/skimage/measure/tests/test_regionprops.py +++ b/skimage/measure/tests/test_regionprops.py @@ -383,8 +383,8 @@ def test_equals(): r2 = regions[0] r3 = regions[1] - assert r1 == r2 - assert r1 != r3 + assert_equal(r1 == r2, True, "Same regionprops are not equal") + assert_equal(r1 != r3, True, "Different regionprops are equal") if __name__ == "__main__":