| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import numpy as np
- from ._felzenszwalb_cy import _felzenszwalb_cython
- from .._shared import utils
- @utils.channel_as_last_axis(multichannel_output=False)
- def felzenszwalb(image, scale=1, sigma=0.8, min_size=20, *, channel_axis=-1):
- """Computes Felsenszwalb's efficient graph based image segmentation.
- Produces an oversegmentation of a multichannel (i.e. RGB) image
- using a fast, minimum spanning tree based clustering on the image grid.
- The parameter ``scale`` sets an observation level. Higher scale means
- less and larger segments. ``sigma`` is the diameter of a Gaussian kernel,
- used for smoothing the image prior to segmentation.
- The number of produced segments as well as their size can only be
- controlled indirectly through ``scale``. Segment size within an image can
- vary greatly depending on local contrast.
- For RGB images, the algorithm uses the euclidean distance between pixels in
- color space.
- Parameters
- ----------
- image : (M, N[, 3]) ndarray
- Input image.
- scale : float
- Free parameter. Higher means larger clusters.
- sigma : float
- Width (standard deviation) of Gaussian kernel used in preprocessing.
- min_size : int
- Minimum component size. Enforced using postprocessing.
- channel_axis : int or None, optional
- If None, the image is assumed to be a grayscale (single channel) image.
- Otherwise, this parameter indicates which axis of the array corresponds
- to channels.
- .. versionadded:: 0.19
- ``channel_axis`` was added in 0.19.
- Returns
- -------
- segment_mask : (M, N) ndarray
- Integer mask indicating segment labels.
- References
- ----------
- .. [1] Efficient graph-based image segmentation, Felzenszwalb, P.F. and
- Huttenlocher, D.P. International Journal of Computer Vision, 2004
- Notes
- -----
- The `k` parameter used in the original paper renamed to `scale` here.
- Examples
- --------
- >>> from skimage.segmentation import felzenszwalb
- >>> from skimage.data import coffee
- >>> img = coffee()
- >>> segments = felzenszwalb(img, scale=3.0, sigma=0.95, min_size=5)
- """
- if channel_axis is None and image.ndim > 2:
- raise ValueError(
- "This algorithm works only on single or " "multi-channel 2d images. "
- )
- image = np.atleast_3d(image)
- return _felzenszwalb_cython(image, scale=scale, sigma=sigma, min_size=min_size)
|