B
    \                 @   sb   d dl mZ d dlZd dlZd dlmZ ddl	m
Z
mZ ddlmZmZ ddlmZ dddZdS )    )divisionN)ndimage   )img_as_floatregular_grid)_slic_cython"_enforce_label_connectivity_cython)rgb2labd         $@
   T      ?   Fc       "      C   s  t | } d}| jdkr.| tjdtjf } d}n>| jdkrP|rP| tjdf } d}n| jdkrl|sl| dtjf } |dkrtd}nt|ttfrtj|tj	d}t|t
jstj|||gtj	d}||tj	 }nt|ttfrtj|tj	d}|dk rt|dg }t| |} |rf|s.|dkrf| jd	 dkrN|rNtd
n| jd	 dkrft| } | jdd \}}}tjd|d|d|f \}}}t| jdd |}dd |D \}}}|| }|| }|| }t|j| jd f }tj|dtjf |dtjf |dtjf |gd	dd	d| jd  }t|}tt|||f}d| }t| | } t| |||||}|r|| | | }t|	| } t|
| }!t|| |!}|r|d }|S )u"  Segments image using k-means clustering in Color-(x,y,z) space.

    Parameters
    ----------
    image : 2D, 3D or 4D ndarray
        Input image, which can be 2D or 3D, and grayscale or multichannel
        (see `multichannel` parameter).
    n_segments : int, optional
        The (approximate) number of labels in the segmented output image.
    compactness : float, optional
        Balances color proximity and space proximity. Higher values give
        more weight to space proximity, making superpixel shapes more
        square/cubic. In SLICO mode, this is the initial compactness.
        This parameter depends strongly on image contrast and on the
        shapes of objects in the image. We recommend exploring possible
        values on a log scale, e.g., 0.01, 0.1, 1, 10, 100, before
        refining around a chosen value.
    max_iter : int, optional
        Maximum number of iterations of k-means.
    sigma : float or (3,) array-like of floats, optional
        Width of Gaussian smoothing kernel for pre-processing for each
        dimension of the image. The same sigma is applied to each dimension in
        case of a scalar value. Zero means no smoothing.
        Note, that `sigma` is automatically scaled if it is scalar and a
        manual voxel spacing is provided (see Notes section).
    spacing : (3,) array-like of floats, optional
        The voxel spacing along each image dimension. By default, `slic`
        assumes uniform spacing (same voxel resolution along z, y and x).
        This parameter controls the weights of the distances along z, y,
        and x during k-means clustering.
    multichannel : bool, optional
        Whether the last axis of the image is to be interpreted as multiple
        channels or another spatial dimension.
    convert2lab : bool, optional
        Whether the input should be converted to Lab colorspace prior to
        segmentation. The input image *must* be RGB. Highly recommended.
        This option defaults to ``True`` when ``multichannel=True`` *and*
        ``image.shape[-1] == 3``.
    enforce_connectivity: bool, optional
        Whether the generated segments are connected or not
    min_size_factor: float, optional
        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, optional
        Proportion of the maximum connected segment size. A value of 3 works
        in most of the cases.
    slic_zero: bool, optional
        Run SLIC-zero, the zero-parameter mode of SLIC. [2]_

    Returns
    -------
    labels : 2D or 3D array
        Integer mask indicating segment labels.

    Raises
    ------
    ValueError
        If ``convert2lab`` is set to ``True`` but the last array
        dimension is not of length 3.

    Notes
    -----
    * If `sigma > 0`, the image is smoothed using a Gaussian kernel prior to
      segmentation.

    * If `sigma` is scalar and `spacing` is provided, the kernel width is
      divided along each dimension by the spacing. For example, if ``sigma=1``
      and ``spacing=[5, 1, 1]``, the effective `sigma` is ``[0.2, 1, 1]``. This
      ensures sensible smoothing for anisotropic images.

    * The image is rescaled to be in [0, 1] prior to processing.

    * Images of shape (M, N, 3) are interpreted as 2D RGB images by default. To
      interpret them as 3D with the last dimension having length 3, use
      `multichannel=False`.

    References
    ----------
    .. [1] Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi,
        Pascal Fua, and Sabine Süsstrunk, SLIC Superpixels Compared to
        State-of-the-art Superpixel Methods, TPAMI, May 2012.
    .. [2] http://ivrg.epfl.ch/research/superpixels#SLICO

    Examples
    --------
    >>> from skimage.segmentation import slic
    >>> from skimage.data import astronaut
    >>> img = astronaut()
    >>> segments = slic(img, n_segments=100, compactness=10)

    Increasing the compactness parameter yields more square regions:

    >>> segments = slic(img, n_segments=100, compactness=20)

    Fr   .Tr   N)Zdtyper   z/Lab colorspace conversion requires a RGB image.c             S   s$   g | ]}t |jd k	r|jndqS )N   )intstep).0s r   Dlib/python3.7/site-packages/skimage/segmentation/slic_superpixels.py
<listcomp>   s   zslic.<locals>.<listcomp>)Zaxisg      ?)r   ndimnpZnewaxisZones
isinstancelisttupleZarrayZdoublecollIterableZastypeanyndiZgaussian_filtershape
ValueErrorr	   Zmgridr   ZzerosZconcatenateZreshapeZascontiguousarrayfloatmaxr   r   r   )"ZimageZ
n_segmentsZcompactnessZmax_iterZsigmaZspacingZmultichannelZconvert2labZenforce_connectivityZmin_size_factorZmax_size_factorZ	slic_zeroZis_2dZdepthZheightwidthZgrid_zZgrid_yZgrid_xZslicesZstep_zZstep_yZstep_xZ
segments_zZ
segments_yZ
segments_xZsegments_colorZsegmentsr   ZratiolabelsZsegment_sizeZmin_sizeZmax_sizer   r   r   slic   sp    d

"
r'   )r
   r   r   r   NTNTr   r   F)Z
__future__r   collectionsr   Znumpyr   Zscipyr   r    utilr   r   Zsegmentation._slicr   r   Zcolorr	   r'   r   r   r   r   <module>   s      