skimage 0.17.2

ParametersReturnsBackRef
find_boundaries(label_img, connectivity=1, mode='thick', background=0)

Parameters

label_img : array of int or bool

An array in which different regions are labeled with either different integers or boolean values.

connectivity : int in {1, ..., `label_img.ndim`}, optional

A pixel is considered a boundary pixel if any of its neighbors has a different label. :None:None:`connectivity` controls which pixels are considered neighbors. A connectivity of 1 (default) means pixels sharing an edge (in 2D) or a face (in 3D) will be considered neighbors. A connectivity of :None:None:`label_img.ndim` means pixels sharing a corner will be considered neighbors.

mode : string in {'thick', 'inner', 'outer', 'subpixel'}

How to mark the boundaries:

  • thick: any pixel not completely surrounded by pixels of the same label (defined by :None:None:`connectivity`) is marked as a boundary. This results in boundaries that are 2 pixels thick.

  • inner: outline the pixels just inside of objects, leaving background pixels untouched.

  • outer: outline pixels in the background around object boundaries. When two objects touch, their boundary is also marked.

  • subpixel: return a doubled image, with pixels between the original pixels marked as boundary where appropriate.

background : int, optional

For modes 'inner' and 'outer', a definition of a background label is required. See :None:None:`mode` for descriptions of these two.

Returns

boundaries : array of bool, same shape as `label_img`

A bool image where True represents a boundary pixel. For :None:None:`mode` equal to 'subpixel', boundaries.shape[i] is equal to 2 * label_img.shape[i] - 1 for all i (a pixel is inserted in between all other pairs of pixels).

Return bool array where boundaries between labeled regions are True.

Examples

This example is valid syntax, but we were not able to check execution
>>> labels = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
...  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
...  [0, 0, 0, 0, 0, 5, 5, 5, 0, 0],
...  [0, 0, 1, 1, 1, 5, 5, 5, 0, 0],
...  [0, 0, 1, 1, 1, 5, 5, 5, 0, 0],
...  [0, 0, 1, 1, 1, 5, 5, 5, 0, 0],
...  [0, 0, 0, 0, 0, 5, 5, 5, 0, 0],
...  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
...  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=np.uint8)
... find_boundaries(labels, mode='thick').astype(np.uint8) array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 1, 0, 0], [0, 0, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 0, 1, 1, 0], [0, 1, 1, 0, 1, 1, 0, 1, 1, 0], [0, 1, 1, 1, 1, 1, 0, 1, 1, 0], [0, 0, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
This example is valid syntax, but we were not able to check execution
>>> find_boundaries(labels, mode='inner').astype(np.uint8)
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 0, 1, 0, 0],
       [0, 0, 1, 0, 1, 1, 0, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
This example is valid syntax, but we were not able to check execution
>>> find_boundaries(labels, mode='outer').astype(np.uint8)
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 0, 0, 1, 0],
       [0, 1, 0, 0, 1, 1, 0, 0, 1, 0],
       [0, 1, 0, 0, 1, 1, 0, 0, 1, 0],
       [0, 1, 0, 0, 1, 1, 0, 0, 1, 0],
       [0, 0, 1, 1, 1, 1, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
This example is valid syntax, but we were not able to check execution
>>> labels_small = labels[::2, ::3]
... labels_small array([[0, 0, 0, 0], [0, 0, 5, 0], [0, 1, 5, 0], [0, 0, 5, 0], [0, 0, 0, 0]], dtype=uint8)
This example is valid syntax, but we were not able to check execution
>>> find_boundaries(labels_small, mode='subpixel').astype(np.uint8)
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0],
       [0, 0, 0, 1, 0, 1, 0],
       [0, 1, 1, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0],
       [0, 1, 1, 1, 0, 1, 0],
       [0, 0, 0, 1, 0, 1, 0],
       [0, 0, 0, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
This example is valid syntax, but we were not able to check execution
>>> bool_image = np.array([[False, False, False, False, False],
...  [False, False, False, False, False],
...  [False, False, True, True, True],
...  [False, False, True, True, True],
...  [False, False, True, True, True]], dtype=np.bool)
... find_boundaries(bool_image) array([[False, False, False, False, False], [False, False, True, True, True], [False, True, True, True, True], [False, True, True, False, False], [False, True, True, False, False]])
See :

Back References

The following pages refer to to this document either explicitly or contain code examples using this.

skimage.segmentation.boundaries.find_boundaries skimage.segmentation.boundaries.mark_boundaries

Local connectivity graph

Hover to see nodes names; edges to Self not shown, Caped at 50 nodes.

Using a canvas is more power efficient and can get hundred of nodes ; but does not allow hyperlinks; , arrows or text (beyond on hover)

SVG is more flexible but power hungry; and does not scale well to 50 + nodes.

All aboves nodes referred to, (or are referred from) current nodes; Edges from Self to other have been omitted (or all nodes would be connected to the central node "self" which is not useful). Nodes are colored by the library they belong to, and scaled with the number of references pointing them


File: /skimage/segmentation/boundaries.py#48
type: <class 'function'>
Commit: