Skip to content

Commit

Permalink
Prevent infinite loop in adapthist for low clip_limit
Browse files Browse the repository at this point in the history
Prevent infinite loop in adapthist

Add a test that exposed the infinite loop

Use better check to prevent endless loop
  • Loading branch information
blink1073 committed Oct 26, 2015
1 parent d776464 commit aabf2de
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 1 deletion.
6 changes: 6 additions & 0 deletions skimage/exposure/_adapthist.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,8 @@ def clip_histogram(hist, clip_limit):
n_excess -= mid.size * clip_limit - mid.sum()
hist[mid_mask] = clip_limit

prev_n_excess = n_excess

while n_excess > 0: # Redistribute remaining excess
index = 0
while n_excess > 0 and index < hist.size:
Expand All @@ -256,6 +258,10 @@ def clip_histogram(hist, clip_limit):
hist[under_mask] += 1
n_excess -= under_mask.sum()
index += 1
# bail if we have not distributed any excess
if prev_n_excess == n_excess:
break
prev_n_excess = n_excess

return hist

Expand Down
2 changes: 1 addition & 1 deletion skimage/exposure/tests/test_exposure.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ def test_adapthist_grayscale():
img = np.dstack((img, img, img))
with expected_warnings(['precision loss|non-contiguous input',
'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)
adapted = exposure.equalize_adapthist(img, kernel_size=(57, 51), clip_limit=0.01, nbins=128)
assert img.shape == adapted.shape
Expand Down

0 comments on commit aabf2de

Please sign in to comment.