From e68ab76b2411870bb6b6a798bd44ff2194af04ec Mon Sep 17 00:00:00 2001 From: Guillem Palou Date: Mon, 23 Dec 2013 01:17:51 +0100 Subject: [PATCH] Added max_size as a parameter --- skimage/segmentation/_slic.pyx | 10 +++++----- skimage/segmentation/slic_superpixels.py | 12 +++++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/skimage/segmentation/_slic.pyx b/skimage/segmentation/_slic.pyx index b3a00a52..6f97abff 100644 --- a/skimage/segmentation/_slic.pyx +++ b/skimage/segmentation/_slic.pyx @@ -11,7 +11,8 @@ from skimage.util import regular_grid def _enforce_label_connectivity_cython(Py_ssize_t[:, :, ::1] nearest_segments, Py_ssize_t n_segments, - int min_size): + int min_size, + int max_size): """ Helper function to remove small disconnected regions from the labels Parameters @@ -22,7 +23,9 @@ def _enforce_label_connectivity_cython(Py_ssize_t[:, :, ::1] nearest_segments, number of specified segments min_size: int minimum size of the segment - + max_size: int + maximum size of the segment. This is done for performance reasons, + to pre-allocate a sufficiently large array for the breadth first search Returns ------- connected_nearest_segments : 3D array of int, shape (Z, Y, X) @@ -40,9 +43,6 @@ def _enforce_label_connectivity_cython(Py_ssize_t[:, :, ::1] nearest_segments, cdef Py_ssize_t[:] ddy = np.array((0,0,1,-1,0,0)) cdef Py_ssize_t[:] ddz = np.array((0,0,0,0,1,-1)) - cdef double size = height*width*depth / n_segments - cdef double max_size = 3*size - #new object with connected segments cdef Py_ssize_t[:, :, ::1] new_nearest_segments \ = np.zeros((depth, height, width), dtype=np.intp) diff --git a/skimage/segmentation/slic_superpixels.py b/skimage/segmentation/slic_superpixels.py index 920d0e48..60d4ac13 100644 --- a/skimage/segmentation/slic_superpixels.py +++ b/skimage/segmentation/slic_superpixels.py @@ -12,7 +12,7 @@ from skimage.color import rgb2lab def slic(image, n_segments=100, compactness=10., max_iter=10, sigma=None, spacing=None, multichannel=True, convert2lab=True, ratio=None, - enforce_connectivity=True, min_size_factor=0.5): + enforce_connectivity=True, min_size_factor=0.5, max_size_factor=3): """Segments image using k-means clustering in Color-(x,y,z) space. Parameters @@ -53,7 +53,9 @@ def slic(image, n_segments=100, compactness=10., max_iter=10, sigma=None, min_size_factor: float proportion of the minimum segment size to be removed with respect to the supposed segment size (depth*width*height/n_segments) - + max_size_factor: float + proportion of the maximum connected segment size. A value of 3 works + in most of the cases. Returns ------- labels : 2D or 3D array @@ -170,7 +172,11 @@ def slic(image, n_segments=100, compactness=10., max_iter=10, sigma=None, labels = _slic_cython(image, segments, max_iter, spacing, enforce_connectivity) if (enforce_connectivity): - labels = _enforce_label_connectivity_cython(labels, n_segments, min_size_factor*depth*height*width/n_segments) + segment_size = depth*height*width/n_segments + labels = _enforce_label_connectivity_cython(labels, + n_segments, + min_size_factor*segment_size, + max_size_factor*segment_size) if is_2d: labels = labels[0]