fix: check pop==0 for some kernels

This commit is contained in:
Olivier Debeir
2012-11-12 10:05:52 +01:00
parent fd82ac9959
commit c9f1b67c7b
3 changed files with 82 additions and 47 deletions
+29 -23
View File
@@ -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 <np.uint16_t>(g - i)
if pop:
for i in range(maxbin):
if histo[i]:
break
return <np.uint16_t>(g - i)
else:
return <np.uint16_t>(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 <np.uint16_t>(i)
return <np.uint16_t>(0)
else:
return <np.uint16_t>(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 <np.uint16_t>(i)
return <np.uint16_t>(0)
else:
return <np.uint16_t>(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 <np.uint16_t>(imax)
return <np.uint16_t>(0)
else:
return <np.uint16_t>(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 <np.uint16_t>(i - g)
if pop:
for i in range(maxbin - 1, -1, -1):
if histo[i]:
break
return <np.uint16_t>(i - g)
else:
return <np.uint16_t>(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 <np.uint16_t>e*1000
for i in range(maxbin):
p = histo[i]/pop
if p>0:
e -= p*log2(p)
return <np.uint16_t>e*1000
else:
return <np.uint16_t>(0)
# -----------------------------------------------------------------
# python wrappers
+31 -24
View File
@@ -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 <np.uint8_t>(g - i)
return <np.uint8_t>(g - i)
else:
return <np.uint8_t>(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 <np.uint8_t>(i)
return <np.uint8_t>(0)
else:
return <np.uint8_t>(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 <np.uint8_t>(i)
return <np.uint8_t>(0)
else:
return <np.uint8_t>(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 <np.uint8_t>(i)
return <np.uint8_t>(0)
else:
return <np.uint8_t>(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 <np.uint8_t>(imax)
return <np.uint8_t>(0)
else:
return <np.uint8_t>(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 <np.uint8_t>(i - g)
if pop:
for i in range(255, -1, -1):
if histo[i]:
break
return <np.uint8_t>(i - g)
else:
return <np.uint8_t>(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 <np.uint8_t>e*10
for i in range(256):
p = histo[i] / pop
if p > 0:
e -= p * log2(p)
return <np.uint8_t>e*10
else:
return <np.uint8_t>(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,
+22
View File
@@ -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()