From c9f1b67c7b029b65fa9a6c53b91717efd61b3eb8 Mon Sep 17 00:00:00 2001 From: Olivier Debeir Date: Mon, 12 Nov 2012 10:05:52 +0100 Subject: [PATCH] fix: check pop==0 for some kernels --- skimage/filter/rank/_crank16.pyx | 52 +++++++++++++----------- skimage/filter/rank/_crank8.pyx | 55 +++++++++++++++----------- skimage/filter/rank/tests/test_rank.py | 22 +++++++++++ 3 files changed, 82 insertions(+), 47 deletions(-) diff --git a/skimage/filter/rank/_crank16.pyx b/skimage/filter/rank/_crank16.pyx index ce300cdd..67db0c69 100644 --- a/skimage/filter/rank/_crank16.pyx +++ b/skimage/filter/rank/_crank16.pyx @@ -44,12 +44,14 @@ cdef inline np.uint16_t kernel_bottomhat(Py_ssize_t * histo, float pop, Py_ssize_t s0, Py_ssize_t s1): cdef Py_ssize_t i - for i in range(maxbin): - if histo[i]: - break - - return (g - i) + if pop: + for i in range(maxbin): + if histo[i]: + break + return (g - i) + else: + return (0) cdef inline np.uint16_t kernel_equalize(Py_ssize_t * histo, float pop, np.uint16_t g, Py_ssize_t bitdepth, @@ -155,8 +157,8 @@ cdef inline np.uint16_t kernel_median(Py_ssize_t * histo, float pop, sum -= histo[i] if sum < 0: return (i) - - return (0) + else: + return (0) cdef inline np.uint16_t kernel_minimum(Py_ssize_t * histo, float pop, @@ -170,8 +172,8 @@ cdef inline np.uint16_t kernel_minimum(Py_ssize_t * histo, float pop, for i in range(maxbin): if histo[i]: return (i) - - return (0) + else: + return (0) cdef inline np.uint16_t kernel_modal(Py_ssize_t * histo, float pop, @@ -187,8 +189,8 @@ cdef inline np.uint16_t kernel_modal(Py_ssize_t * histo, float pop, hmax = histo[i] imax = i return (imax) - - return (0) + else: + return (0) cdef inline np.uint16_t kernel_morph_contr_enh(Py_ssize_t * histo, @@ -249,12 +251,14 @@ cdef inline np.uint16_t kernel_tophat(Py_ssize_t * histo, float pop, Py_ssize_t s0, Py_ssize_t s1): cdef Py_ssize_t i - for i in range(maxbin - 1, -1, -1): - if histo[i]: - break - - return (i - g) + if pop: + for i in range(maxbin - 1, -1, -1): + if histo[i]: + break + return (i - g) + else: + return (0) cdef inline np.uint16_t kernel_entropy(Py_ssize_t * histo, float pop, np.uint16_t g, Py_ssize_t bitdepth, @@ -264,15 +268,17 @@ cdef inline np.uint16_t kernel_entropy(Py_ssize_t * histo, float pop, cdef Py_ssize_t i cdef float e,p - e = 0. + if pop: + e = 0. - for i in range(maxbin): - p = histo[i]/pop - if p>0: - e -= p*log2(p) - - return e*1000 + for i in range(maxbin): + p = histo[i]/pop + if p>0: + e -= p*log2(p) + return e*1000 + else: + return (0) # ----------------------------------------------------------------- # python wrappers diff --git a/skimage/filter/rank/_crank8.pyx b/skimage/filter/rank/_crank8.pyx index 53076217..9b69296b 100644 --- a/skimage/filter/rank/_crank8.pyx +++ b/skimage/filter/rank/_crank8.pyx @@ -44,11 +44,14 @@ cdef inline np.uint8_t kernel_bottomhat(Py_ssize_t * histo, float pop, cdef Py_ssize_t i - for i in range(256): - if histo[i]: - break + if pop: + for i in range(256): + if histo[i]: + break - return (g - i) + return (g - i) + else: + return (0) cdef inline np.uint8_t kernel_equalize(Py_ssize_t * histo, float pop, @@ -99,8 +102,8 @@ cdef inline np.uint8_t kernel_maximum(Py_ssize_t * histo, float pop, for i in range(255, -1, -1): if histo[i]: return (i) - - return (0) + else: + return (0) cdef inline np.uint8_t kernel_mean(Py_ssize_t * histo, float pop, @@ -146,8 +149,8 @@ cdef inline np.uint8_t kernel_median(Py_ssize_t * histo, float pop, sum -= histo[i] if sum < 0: return (i) - - return (0) + else: + return (0) cdef inline np.uint8_t kernel_minimum(Py_ssize_t * histo, float pop, @@ -160,8 +163,8 @@ cdef inline np.uint8_t kernel_minimum(Py_ssize_t * histo, float pop, for i in range(256): if histo[i]: return (i) - - return (0) + else: + return (0) cdef inline np.uint8_t kernel_modal(Py_ssize_t * histo, float pop, @@ -176,8 +179,8 @@ cdef inline np.uint8_t kernel_modal(Py_ssize_t * histo, float pop, hmax = histo[i] imax = i return (imax) - - return (0) + else: + return (0) cdef inline np.uint8_t kernel_morph_contr_enh(Py_ssize_t * histo, float pop, @@ -231,12 +234,14 @@ cdef inline np.uint8_t kernel_tophat(Py_ssize_t * histo, float pop, cdef Py_ssize_t i - for i in range(255, -1, -1): - if histo[i]: - break - - return (i - g) + if pop: + for i in range(255, -1, -1): + if histo[i]: + break + return (i - g) + else: + return (0) cdef inline np.uint8_t kernel_noise_filter(Py_ssize_t * histo, float pop, np.uint8_t g, float p0, float p1, @@ -268,15 +273,17 @@ cdef inline np.uint8_t kernel_entropy(Py_ssize_t * histo, float pop, cdef Py_ssize_t i cdef float e,p - e = 0. + if pop: + e = 0. - for i in range(256): - p = histo[i] / pop - if p > 0: - e -= p * log2(p) - - return e*10 + for i in range(256): + p = histo[i] / pop + if p > 0: + e -= p * log2(p) + return e*10 + else: + return (0) cdef inline np.uint8_t kernel_otsu(Py_ssize_t * histo, float pop, np.uint8_t g, float p0, float p1, Py_ssize_t s0, diff --git a/skimage/filter/rank/tests/test_rank.py b/skimage/filter/rank/tests/test_rank.py index 10aeb5ac..7603fee1 100644 --- a/skimage/filter/rank/tests/test_rank.py +++ b/skimage/filter/rank/tests/test_rank.py @@ -295,6 +295,28 @@ def test_smallest_selem16(): shift_x=0, shift_y=0) assert_array_equal(image, out) +def test_empty_selem(): + # check that min, max and mean returns zeros if structuring element is empty + + image = np.zeros((5, 5), dtype=np.uint16) + out = np.zeros_like(image) + mask = np.ones_like(image, dtype=np.uint8) + res = np.zeros_like(image) + image[2,2] = 255 + image[2,3] = 128 + image[1,2] = 16 + + elem = np.array([[0,0,0],[0,0,0]], dtype=np.uint8) + + rank.mean(image=image, selem=elem, out=out, mask=mask, + shift_x=0, shift_y=0) + assert_array_equal(res, out) + rank.minimum(image=image, selem=elem, out=out, mask=mask, + shift_x=0, shift_y=0) + assert_array_equal(res, out) + rank.maximum(image=image, selem=elem, out=out, mask=mask, + shift_x=0, shift_y=0) + assert_array_equal(res, out) if __name__ == "__main__": run_module_suite()