mirror of
https://github.com/wassname/scikit-image.git
synced 2026-08-13 12:40:24 +08:00
fix: check pop==0 for some kernels
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user