
    1-Ph?                         d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlm	Z	 d dl
mZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZmZ d Zd Z ej        d          	 	 	 	 	 	 	 	 	 	 	 	 dddd            ZdS )    N)Iterable)warn)random)kmeans2)pdist
squareform   )utils)gaussian)rgb2lab)img_as_floatregular_grid   )"_enforce_label_connectivity_cython_slic_cythonc                    t          j        t          j        |           t                    j        }t          j        d          }t          j        t          |          t                    }t          j
        |                    |t          |t          |                    d                    }d}|r
| j        dz
  n| j        }t          ||z  |z            }	t          |          |	k    r+t          j
        |                    ||	d                    }
nt          }
t          ||
         ||         d          \  }}t!          t#          |                    }t          j        |t           j                   |                    d	          }t+          |||d
d
f         z
                                d          }||fS )a  Find regularly spaced centroids on a mask.

    Parameters
    ----------
    mask : 3D ndarray
        The mask within which the centroids must be positioned.
    n_centroids : int
        The number of centroids to be returned.

    Returns
    -------
    centroids : 2D ndarray
        The coordinates of the centroids with shape (n_centroids, 3).
    steps : 1D ndarray
        The approximate distance between two seeds in all dimensions.

    dtype{   F)replace
   r      )iterNr   )nparraynonzerofloatTr   RandomStatearangelenintsortchoiceminndimEllipsisr   r   r   fill_diagonalinfargminabsmean)maskn_centroidsmultichannelcoordrngidx_fullidxdense_factorndim_spatialn_dense	idx_dense	centroids_distclosest_ptsstepss                   e/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/skimage/segmentation/slic_superpixels.py_get_mask_centroidsr?      s   ( HRZ%%U3335E 
S
!
!C yU3///H
'#**Xs;E

'C'CU*SS
T
TC L$0?49q==diL<-<==G
5zzG GCJJx%JHHII			5+U3Za@@@LIq eI&&''DT26"""++b//K	Ik111n5566;;A>>Ee    c                    | j         dd         \  }}}t          j        d|d|d|f         \  }}}t          | j         dd         |          }||                                         dt          j        f         }	||                                         dt          j        f         }
||                                         dt          j        f         }t          j        |	|
|gd          }t          j        d |D                       }||fS )a  Find regularly spaced centroids on the image.

    Parameters
    ----------
    image : 2D, 3D or 4D ndarray
        Input image, which can be 2D or 3D, and grayscale or
        multichannel.
    n_centroids : int
        The (approximate) number of centroids to be returned.

    Returns
    -------
    centroids : 2D ndarray
        The coordinates of the centroids with shape (~n_centroids, 3).
    steps : 1D ndarray
        The approximate distance between two seeds in all dimensions.

    N   .r   axisc                 H    g | ]}|j         t          |j                   nd S )N      ?)stepr   ).0ss     r>   
<listcomp>z'_get_grid_centroids.<locals>.<listcomp>e   s+    UUU);afUUUr@   )shaper   mgridr   ravelnewaxisconcatenateasarray)imager/   dhwgrid_zgrid_ygrid_xslicescentroids_zcentroids_ycentroids_xr9   r=   s                 r>   _get_grid_centroidsr\   G   s    & k"1"oGAq!Xbqb"1"bqbj1FFF%+bqb/;77F.&&((bj9K.&&((bj9K.&&((bj9K[+FRPPPIJUUfUUUVVEer@   F)multichannel_outputd         $@r   T      ?rB   r   )channel_axisc                   | j         dk    r|t          d| d          t          |           } t          j        | j                  }|                     |d          } |Yt          j        |t                    }|1t          j
        ||          }t          j        || j                  }n|}| |         }n| }|                                }|                                }t          j        |          rt          d	          t          j        |          st          j        |          rt          d
          | |z  } ||k    r| ||z
  z  } |du}| j        }d}|du}| j         dk    r"| t          j        dt          j        f         } d}nE| j         dk    r|r| t          j        df         } d}n!| j         dk    r|s| dt          j        f         } |rF|s|B| j        |         dk    r|rt          d          | j        |         dk    rt%          |           } |dvrt          d          d}|r|                    d          }|j         dk    r&t          j        |t          j        df                   }|j        | j        dd         k    rt          d          t)          |||          \  }}d}nt+          | |          \  }}|t          j        d|          }nt/          |t0                    rt          j        ||          }|r]|j        dk    r;|j        dk    rt7          dt8          d           nRt          d|j         d          t          j        |dd          }n#|j        dk    rt          d|j         d          t          j        ||          }nt=          d          t          j        |          rt          j         |||g|          }||z  }nt/          |t0                    rt          j        ||          }|r]|j        dk    r;|j        dk    rt7          dt8          d           nRt          d|j         d          t          j        |dd          }n#|j        dk    rt          d|j         d          |dk    !                                r%tE          |          dgz   }tG          | |d           } |j        d         }t          j        t          j$        |t          j%        || j        d         f          gd!          |          }t          |          }d"|z  }t          j        | |z  |          } |rtM          | ||||||
d|#	  	         tM          | ||||||
d|#	  	        }|ru|r|'                                |z  }n$tQ          j)        | j        dd                   |z  }tU          ||z            } tU          |	|z            }!tW          || |!|$          }|r|d         }|S )%u  Segments image using k-means clustering in Color-(x,y,z) space.

    Parameters
    ----------
    image : (M, N[, P][, C]) ndarray
        Input image. Can be 2D or 3D, and grayscale or multichannel
        (see `channel_axis` parameter).
        Input image must either be NaN-free or the NaN's must be masked out.
    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_num_iter : int, optional
        Maximum number of iterations of k-means.
    sigma : float or 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
        if a manual voxel spacing is provided (see Notes section). If
        sigma is array-like, its size must match ``image``'s number
        of spatial dimensions.
    spacing : array-like of floats, optional
        The voxel spacing along each spatial dimension. By default,
        `slic` assumes uniform spacing (same voxel resolution along
        each spatial dimension).
        This parameter controls the weights of the distances along the
        spatial dimensions during k-means clustering.
    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 ``channel_axis` is not None *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]_
    start_label : int, optional
        The labels' index start. Should be 0 or 1.

        .. versionadded:: 0.17
           ``start_label`` was introduced in 0.17
    mask : ndarray, optional
        If provided, superpixels are computed only where mask is True,
        and seed points are homogeneously distributed over the mask
        using a k-means clustering strategy. Mask number of dimensions
        must be equal to image number of spatial dimensions.

        .. versionadded:: 0.17
           ``mask`` was introduced in 0.17
    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
    -------
    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.
    ValueError
        If ``start_label`` is not 0 or 1.
    ValueError
        If ``image`` contains unmasked NaN values.
    ValueError
        If ``image`` contains unmasked infinite values.
    ValueError
        If ``image`` is 2D but ``channel_axis`` is -1 (the default).

    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 (masked
      values are ignored).

    * 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
      `channel_axis=None`.

    * `start_label` is introduced to handle the issue [4]_. Label indexing
      starts at 1 by default.

    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.
        :DOI:`10.1109/TPAMI.2012.120`
    .. [2] https://www.epfl.ch/labs/ivrl/research/slic-superpixels/#SLICO
    .. [3] Irving, Benjamin. "maskSLIC: regional superpixel generation with
           application to local pathology characterisation in medical images.",
           2016, :arXiv:`1606.09518`
    .. [4] https://github.com/scikit-image/scikit-image/issues/3722

    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)

    r	   Nzchannel_axis=z| indicates multichannel, which is not supported for a two-dimensional image; use channel_axis=None if the image is grayscaleT)copyr   rC   z.unmasked NaN values in image are not supportedz3unmasked infinite values in image are not supportedF.rB   z/Lab colorspace conversion requires a RGB image.)r   r   zstart_label should be 0 or 1.uint8z*image and mask should have the same shape.zdInput image is 2D: spacing number of elements must be 2. In the future, a ValueError will be raised.)
stacklevelz#Input image is 2D, but spacing has z elements (expected 2).r   r   z#Input image is 3D, but spacing has z elements (expected 3).z!spacing must be None or iterable.zbInput image is 2D: sigma number of elements must be 2. In the future, a ValueError will be raised.z!Input image is 2D, but sigma has z!Input image is 3D, but sigma has reflect)sigmamoder   rF   )ignore_colorstart_label)rj   ),r'   
ValueErrorr   r
   _supported_float_typer   astyper   ascontiguousarrayboolexpand_dimsbroadcast_torK   r&   maxisnanisinfrN   r   viewr?   r\   ones
isinstancer   rP   sizer   FutureWarninginsert	TypeErrorisscalarr   anylistr   rO   zerosr   summathprodr#   r   )"rQ   
n_segmentscompactnessmax_num_iterrg   spacingconvert2labenforce_connectivitymin_size_factormax_size_factor	slic_zerorj   r.   ra   float_dtypemask_image_valuesiminimaxuse_maskr   is_2dr0   update_centroidsr9   r=   r/   segmentsrG   ratiolabelssegment_sizemin_sizemax_sizes"                                     r>   slicr   i   s&   n zQ<3%L % % %
 
 	
 E-ek::K LL4L00E#D555#N4l;;;EOE5;77EEEU| DD	x~~ KIJJJ	x~~ P$ PNOOO	TMEt||4HKEEt+LzQbj#rz12	q\bj#o&	qc2:o& # #(;;|$))k)NOOO[&!++ENNE&  8999  	Byy!!9>>'RZ_(=>>D:RaR((IJJJ.tZNN	5.ujAA	5'!5)))	GX	&	& =*WE222 	|q  <1$$* &#$     %A"<A A A  
 )GQ22\Q9<9 9 9   &we<<<;<<<	{5 %.e<<<	E8	$	$ 
5... 	zQ<1$$* &#$     %? :? ? ?  
 	%A..Z1__7:7 7 7  
 		 =Uqc!e)<<</!$K#
	28[%+a.,I#J#JKRTUUU  H u::D+E e<<<E 
#
	
 
	
 
	
 
	
 
 
 
F  	
 	D88::3LL9U[!_55CL5665663HhK
 
 
  Mr@   )r^   r_   r   r   NNTr`   rB   Fr   N)r   collections.abcr   warningsr   numpyr   r   scipy.cluster.vqr   scipy.spatial.distancer   r   _sharedr
   _shared.filtersr   colorr   utilr   r   _slicr   r   r?   r\   channel_as_last_axisr    r@   r>   <module>r      sx    $ $ $ $ $ $                 $ $ $ $ $ $ 4 4 4 4 4 4 4 4       & & & & & &       - - - - - - - - C C C C C C C C3 3 3l  D 666 
	W W W W W 76W W Wr@   