skimage2.segmentation.expand_labels#
- skimage2.segmentation.expand_labels(label_image, distance=1, spacing=1)[source]#
Expand labels in label image by
distancepixels without overlapping.Given a label image,
expand_labelsgrows label regions (connected components) outwards by up todistanceunits without overflowing into neighboring regions. More specifically, each background pixel that is within Euclidean distance of <=distancepixels of a connected component is assigned the label of that connected component. Thespacingparameter can be used to specify the spacing rate of the distance transform used to calculate the Euclidean distance for anisotropic images. Where multiple connected components are withindistancepixels of a background pixel, the label value of the closest connected component will be assigned (see Notes for the case of multiple labels at equal distance).- Parameters:
- label_imagendarray of dtype int
label image
- distancefloat
Euclidean distance in pixels by which to grow the labels. Default is one.
- spacingfloat, or sequence of float, optional
Spacing of elements along each dimension. If a sequence, must be of length equal to the input rank; if a single number, this is used for all axes. If not specified, a grid spacing of unity is implied.
- Returns:
- enlarged_labelsndarray of dtype int
Labeled array, where all connected regions have been enlarged
Notes
Where labels are spaced more than
distancepixels are apart, this is equivalent to a morphological dilation with a disc or hyperball of radiusdistance. However, in contrast to a morphological dilation,expand_labelswill not expand a label region into a neighboring region.This implementation of
expand_labelsis derived from CellProfiler [1], where it is known as module “IdentifySecondaryObjects (Distance-N)” [2].There is an important edge case when a pixel has the same distance to multiple regions, as it is not defined which region expands into that space. Here, the exact behavior depends on the upstream implementation of
scipy.ndimage.distance_transform_edt.References
Examples
>>> labels = np.array([0, 1, 0, 0, 0, 0, 2]) >>> expand_labels(labels, distance=1) array([1, 1, 1, 0, 0, 2, 2])
Labels will not overwrite each other:
>>> expand_labels(labels, distance=3) array([1, 1, 1, 1, 2, 2, 2])
In case of ties, behavior is undefined, but currently resolves to the label closest to
(0,) * ndimin lexicographical order.>>> labels_tied = np.array([0, 1, 0, 2, 0]) >>> expand_labels(labels_tied, 1) array([1, 1, 1, 2, 2]) >>> labels2d = np.array( ... [[0, 1, 0, 0], ... [2, 0, 0, 0], ... [0, 3, 0, 0]] ... ) >>> expand_labels(labels2d, 1) array([[2, 1, 1, 0], [2, 2, 0, 0], [2, 3, 3, 0]]) >>> expand_labels(labels2d, 1, spacing=[1, 0.5]) array([[1, 1, 1, 1], [2, 2, 2, 0], [3, 3, 3, 3]])