mirror of
https://github.com/wassname/scikit-image.git
synced 2026-09-09 11:33:41 +08:00
Prevent infinite loop in adapthist for low clip_limit
Prevent infinite loop in adapthist Add a test that exposed the infinite loop Use better check to prevent endless loop
This commit is contained in:
@@ -244,6 +244,8 @@ def clip_histogram(hist, clip_limit):
|
|||||||
n_excess -= mid.size * clip_limit - mid.sum()
|
n_excess -= mid.size * clip_limit - mid.sum()
|
||||||
hist[mid_mask] = clip_limit
|
hist[mid_mask] = clip_limit
|
||||||
|
|
||||||
|
prev_n_excess = n_excess
|
||||||
|
|
||||||
while n_excess > 0: # Redistribute remaining excess
|
while n_excess > 0: # Redistribute remaining excess
|
||||||
index = 0
|
index = 0
|
||||||
while n_excess > 0 and index < hist.size:
|
while n_excess > 0 and index < hist.size:
|
||||||
@@ -256,6 +258,10 @@ def clip_histogram(hist, clip_limit):
|
|||||||
hist[under_mask] += 1
|
hist[under_mask] += 1
|
||||||
n_excess -= under_mask.sum()
|
n_excess -= under_mask.sum()
|
||||||
index += 1
|
index += 1
|
||||||
|
# bail if we have not distributed any excess
|
||||||
|
if prev_n_excess == n_excess:
|
||||||
|
break
|
||||||
|
prev_n_excess = n_excess
|
||||||
|
|
||||||
return hist
|
return hist
|
||||||
|
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ def test_adapthist_grayscale():
|
|||||||
img = np.dstack((img, img, img))
|
img = np.dstack((img, img, img))
|
||||||
with expected_warnings(['precision loss|non-contiguous input',
|
with expected_warnings(['precision loss|non-contiguous input',
|
||||||
'deprecated']):
|
'deprecated']):
|
||||||
adapted_old = exposure.equalize_adapthist(img, 10, 9, clip_limit=0.01,
|
adapted_old = exposure.equalize_adapthist(img, 10, 9, clip_limit=0.001,
|
||||||
nbins=128)
|
nbins=128)
|
||||||
adapted = exposure.equalize_adapthist(img, kernel_size=(57, 51), clip_limit=0.01, nbins=128)
|
adapted = exposure.equalize_adapthist(img, kernel_size=(57, 51), clip_limit=0.01, nbins=128)
|
||||||
assert img.shape == adapted.shape
|
assert img.shape == adapted.shape
|
||||||
|
|||||||
Reference in New Issue
Block a user