diff --git a/skimage/segmentation/_slic.pyx b/skimage/segmentation/_slic.pyx index 1418e902..0935550c 100644 --- a/skimage/segmentation/_slic.pyx +++ b/skimage/segmentation/_slic.pyx @@ -255,7 +255,7 @@ def _enforce_label_connectivity_cython(Py_ssize_t[:, :, ::1] segments, #perform a breadth first search to find # the size of the connected component - while bfs_visited != current_segment_size: + while bfs_visited < current_segment_size < max_size: for i in range(6): zz = coord_list[bfs_visited, 0] + ddz[i] yy = coord_list[bfs_visited, 1] + ddy[i] @@ -271,6 +271,8 @@ def _enforce_label_connectivity_cython(Py_ssize_t[:, :, ::1] segments, coord_list[current_segment_size, 1] = yy coord_list[current_segment_size, 2] = xx current_segment_size += 1 + if current_segment_size >= max_size: + break elif (connected_segments[zz, yy, xx] >= 0 and connected_segments[zz, yy, xx] != current_new_label): adjacent = connected_segments[zz, yy, xx] diff --git a/skimage/segmentation/tests/test_slic.py b/skimage/segmentation/tests/test_slic.py index 239413d4..2dd4cde7 100644 --- a/skimage/segmentation/tests/test_slic.py +++ b/skimage/segmentation/tests/test_slic.py @@ -153,6 +153,12 @@ def test_enforce_connectivity(): enforce_connectivity=False, convert2lab=False) + # Make sure nothing fatal occurs (e.g. buffer overflow) at low values of + # max_size_factor + segments_connected_low_max = slic(img, 2, compactness=0.0001, + enforce_connectivity=True, + convert2lab=False, max_size_factor=0.8) + result_connected = np.array([[0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 1]], np.float) @@ -163,6 +169,7 @@ def test_enforce_connectivity(): assert_equal(segments_connected, result_connected) assert_equal(segments_disconnected, result_disconnected) + assert_equal(segments_connected_low_max, result_connected) def test_slic_zero():