
    0-PhE                         d dl Z d dlZddlmZmZ ddlmZ ddlm	Z	 ddZ
dd	Zddd
dZddd
dZddZd Zdd
dZddd
dZddd
dZdS )    N   )_supported_float_typecheck_nD   )_moments_cy)moments_raw_to_central   c                 &    t          | d|          S )av  Calculate all raw image moments up to a certain order.

    The following properties can be calculated from raw image moments:
     * Area as: ``M[0, 0]``.
     * Centroid as: {``M[1, 0] / M[0, 0]``, ``M[0, 1] / M[0, 0]``}.

    Note that raw moments are neither translation, scale, nor rotation
    invariant.

    Parameters
    ----------
    coords : (N, D) double or uint8 array
        Array of N points that describe an image of D dimensionality in
        Cartesian space.
    order : int, optional
        Maximum order of moments. Default is 3.

    Returns
    -------
    M : (``order + 1``, ``order + 1``, ...) array
        Raw image moments. (D dimensions)

    References
    ----------
    .. [1] Johannes Kilian. Simple Image Analysis By Moments. Durham
           University, version 0.2, Durham, 2001.

    Examples
    --------
    >>> coords = np.array([[row, col]
    ...                    for row in range(13, 17)
    ...                    for col in range(14, 18)], dtype=np.float64)
    >>> M = moments_coords(coords)
    >>> centroid = (M[1, 0] / M[0, 0], M[0, 1] / M[0, 0])
    >>> centroid
    (14.5, 15.5)
    r   )order)moments_coords_central)coordsr   s     X/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/skimage/measure/_moments.pymoments_coordsr   
   s    L "&!59999    c                     t           t                    rt          j         d           t	           d            j        d         }t           j                  }|t          j         dt                    } 
                    |d	          |z
   t          j         fd
t          |dz             D             d                                 j        d|dz
  z  z              d}t          |          D ],} dd|f         }t          j        |dd|z             }||z  }-t          j        |d          }|S )a  Calculate all central image moments up to a certain order.

    The following properties can be calculated from raw image moments:
     * Area as: ``M[0, 0]``.
     * Centroid as: {``M[1, 0] / M[0, 0]``, ``M[0, 1] / M[0, 0]``}.

    Note that raw moments are neither translation, scale nor rotation
    invariant.

    Parameters
    ----------
    coords : (N, D) double or uint8 array
        Array of N points that describe an image of D dimensionality in
        Cartesian space. A tuple of coordinates as returned by
        ``np.nonzero`` is also accepted as input.
    center : tuple of float, optional
        Coordinates of the image centroid. This will be computed if it
        is not provided.
    order : int, optional
        Maximum order of moments. Default is 3.

    Returns
    -------
    Mc : (``order + 1``, ``order + 1``, ...) array
        Central image moments. (D dimensions)

    References
    ----------
    .. [1] Johannes Kilian. Simple Image Analysis By Moments. Durham
           University, version 0.2, Durham, 2001.

    Examples
    --------
    >>> coords = np.array([[row, col]
    ...                    for row in range(13, 17)
    ...                    for col in range(14, 18)])
    >>> moments_coords_central(coords)
    array([[16.,  0., 20.,  0.],
           [ 0.,  0.,  0.,  0.],
           [20.,  0., 25.,  0.],
           [ 0.,  0.,  0.,  0.]])

    As seen above, for symmetric objects, odd-order moments (columns 1 and 3,
    rows 1 and 3) are zero when centered on the centroid, or center of mass,
    of the object (the default). If we break the symmetry by adding a new
    point, this no longer holds:

    >>> coords2 = np.concatenate((coords, [[17, 17]]), axis=0)
    >>> np.round(moments_coords_central(coords2),
    ...          decimals=2)  # doctest: +NORMALIZE_WHITESPACE
    array([[17.  ,  0.  , 22.12, -2.49],
           [ 0.  ,  3.53,  1.73,  7.4 ],
           [25.88,  6.02, 36.63,  8.83],
           [ 4.15, 19.17, 14.8 , 39.6 ]])

    Image moments and central image moments are equivalent (by definition)
    when the center is (0, 0):

    >>> np.allclose(moments_coords(coords),
    ...             moments_coords_central(coords, (0, 0)))
    True
    )axisr   r   Nr   )r   dtypeFcopyc                     g | ]}|z  S  r   ).0cr   s     r   
<listcomp>z*moments_coords_central.<locals>.<listcomp>   s    ;;;Qvqy;;;r   )r   )
isinstancetuplenpstackr   shaper   r   meanfloatastyperangereshapemoveaxissum)	r   centerr   ndim
float_typecalcr   isolated_axisMcs	   `        r   r   r   3   sV   ~ &%   + &r***VQ<?D&v|44J~au555 ]]:E]22V;F X;;;;%	*:*:;;;"EEEF ^^FL44!8+<<==FDd $ $qqq$w M1a$h?? m# 
1			BIr   spacingc                8    t          | d| j        z  ||          S )u  Calculate all raw image moments up to a certain order.

    The following properties can be calculated from raw image moments:
     * Area as: ``M[0, 0]``.
     * Centroid as: {``M[1, 0] / M[0, 0]``, ``M[0, 1] / M[0, 0]``}.

    Note that raw moments are neither translation, scale nor rotation
    invariant.

    Parameters
    ----------
    image : (N[, ...]) double or uint8 array
        Rasterized shape as image.
    order : int, optional
        Maximum order of moments. Default is 3.
    spacing: tuple of float, shape (ndim,)
        The pixel spacing along each axis of the image.

    Returns
    -------
    m : (``order + 1``, ``order + 1``) array
        Raw image moments.

    References
    ----------
    .. [1] Wilhelm Burger, Mark Burge. Principles of Digital Image Processing:
           Core Algorithms. Springer-Verlag, London, 2009.
    .. [2] B. Jähne. Digital Image Processing. Springer-Verlag,
           Berlin-Heidelberg, 6. edition, 2005.
    .. [3] T. H. Reiss. Recognizing Planar Objects Using Invariant Image
           Features, from Lecture notes in computer science, p. 676. Springer,
           Berlin, 1993.
    .. [4] https://en.wikipedia.org/wiki/Image_moment

    Examples
    --------
    >>> image = np.zeros((20, 20), dtype=np.float64)
    >>> image[13:17, 13:17] = 1
    >>> M = moments(image)
    >>> centroid = (M[1, 0] / M[0, 0], M[0, 1] / M[0, 0])
    >>> centroid
    (14.5, 14.5)
    r   r   r/   )moments_centralr)   )imager   r/   s      r   momentsr5      s#    X 5$"35'RRRRr   c                L   |!t          | ||          }t          |          S t          | j                  }|t	          j        | j        |          }|                     |d          }t          | j	                  D ]\  }}	t	          j
        |	|          ||         z  ||         z
  }
|
ddt          j        f         t	          j
        |dz   |          z  }t	          j        ||| j                  }t	          j        ||          }t	          j        |d|          }|S )u  Calculate all central image moments up to a certain order.

    The center coordinates (cr, cc) can be calculated from the raw moments as:
    {``M[1, 0] / M[0, 0]``, ``M[0, 1] / M[0, 0]``}.

    Note that central moments are translation invariant but not scale and
    rotation invariant.

    Parameters
    ----------
    image : (N[, ...]) double or uint8 array
        Rasterized shape as image.
    center : tuple of float, optional
        Coordinates of the image centroid. This will be computed if it
        is not provided.
    order : int, optional
        The maximum order of moments computed.
    spacing: tuple of float, shape (ndim,)
        The pixel spacing along each axis of the image.

    Returns
    -------
    mu : (``order + 1``, ``order + 1``) array
        Central image moments.

    References
    ----------
    .. [1] Wilhelm Burger, Mark Burge. Principles of Digital Image Processing:
           Core Algorithms. Springer-Verlag, London, 2009.
    .. [2] B. Jähne. Digital Image Processing. Springer-Verlag,
           Berlin-Heidelberg, 6. edition, 2005.
    .. [3] T. H. Reiss. Recognizing Planar Objects Using Invariant Image
           Features, from Lecture notes in computer science, p. 676. Springer,
           Berlin, 1993.
    .. [4] https://en.wikipedia.org/wiki/Image_moment

    Examples
    --------
    >>> image = np.zeros((20, 20), dtype=np.float64)
    >>> image[13:17, 13:17] = 1
    >>> M = moments(image)
    >>> centroid = (M[1, 0] / M[0, 0], M[0, 1] / M[0, 0])
    >>> moments_central(image, centroid)
    array([[16.,  0., 20.,  0.],
           [ 0.,  0.,  0.,  0.],
           [20.,  0., 25.,  0.],
           [ 0.,  0.,  0.,  0.]])
    Nr2   r   Fr   r   r   )r5   r   r   r   r   onesr)   r#   	enumerater    arangenewaxisrollaxisdot)r4   r(   r   r/   kwargsmoments_rawfloat_dtyper+   dim
dim_lengthdeltapowers_of_deltas               r   r3   r3      s(   b ~ e5'BBB%k222'44K'%*K888<<%<00D$U[11 * *Z	*K88873<G&QT+U2:.")AI[3
 3
 3
 
 {4ej11vdO,,{4S))Kr   c                 L   t          j        t          j        | j                  |k              rt	          d          |t          j        | j                  }t          j        |           }|                                 d         }t          |          }t          j        t          |dz             | j                  D ]a}t          |          dk     rt           j        ||<   %| |         |t          |          z  z  |t          |          |j        z  dz   z  z  ||<   b|S )u|  Calculate all normalized central image moments up to a certain order.

    Note that normalized central moments are translation and scale invariant
    but not rotation invariant.

    Parameters
    ----------
    mu : (M[, ...], M) array
        Central image moments, where M must be greater than or equal
        to ``order``.
    order : int, optional
        Maximum order of moments. Default is 3.
    spacing: tuple of float, shape (ndim,)
        The pixel spacing along each axis of the image.

    Returns
    -------
    nu : (``order + 1``[, ...], ``order + 1``) array
        Normalized central image moments.

    References
    ----------
    .. [1] Wilhelm Burger, Mark Burge. Principles of Digital Image Processing:
           Core Algorithms. Springer-Verlag, London, 2009.
    .. [2] B. Jähne. Digital Image Processing. Springer-Verlag,
           Berlin-Heidelberg, 6. edition, 2005.
    .. [3] T. H. Reiss. Recognizing Planar Objects Using Invariant Image
           Features, from Lecture notes in computer science, p. 676. Springer,
           Berlin, 1993.
    .. [4] https://en.wikipedia.org/wiki/Image_moment

    Examples
    --------
    >>> image = np.zeros((20, 20), dtype=np.float64)
    >>> image[13:17, 13:17] = 1
    >>> m = moments(image)
    >>> centroid = (m[0, 1] / m[0, 0], m[1, 0] / m[0, 0])
    >>> mu = moments_central(image, centroid)
    >>> moments_normalized(mu)
    array([[       nan,        nan, 0.078125  , 0.        ],
           [       nan, 0.        , 0.        , 0.        ],
           [0.078125  , 0.        , 0.00610352, 0.        ],
           [0.        , 0.        , 0.        , 0.        ]])
    z)Shape of image moments must be >= `order`Nr   r   )repeatr   )r   anyarrayr    
ValueErrorr8   r)   
zeros_likeravelmin	itertoolsproductr$   r'   nan)mur   r/   numu0scalepowerss          r   moments_normalizedrU     s   Z 
vbhrx  E)** FDEEE'"'""	r		B
((**Q-CLLE#E%!)$4$4RWEEE  v;;??BvJJV*uF';;Fbg-12BvJJ Ir   c                     | j         dk    rt          j        nt          j        }t	          j        |                     |d                    S )u@  Calculate Hu's set of image moments (2D-only).

    Note that this set of moments is proved to be translation, scale and
    rotation invariant.

    Parameters
    ----------
    nu : (M, M) array
        Normalized central image moments, where M must be >= 4.

    Returns
    -------
    nu : (7,) array
        Hu's set of image moments.

    References
    ----------
    .. [1] M. K. Hu, "Visual Pattern Recognition by Moment Invariants",
           IRE Trans. Info. Theory, vol. IT-8, pp. 179-187, 1962
    .. [2] Wilhelm Burger, Mark Burge. Principles of Digital Image Processing:
           Core Algorithms. Springer-Verlag, London, 2009.
    .. [3] B. Jähne. Digital Image Processing. Springer-Verlag,
           Berlin-Heidelberg, 6. edition, 2005.
    .. [4] T. H. Reiss. Recognizing Planar Objects Using Invariant Image
           Features, from Lecture notes in computer science, p. 676. Springer,
           Berlin, 1993.
    .. [5] https://en.wikipedia.org/wiki/Image_moment

    Examples
    --------
    >>> image = np.zeros((20, 20), dtype=np.float64)
    >>> image[13:17, 13:17] = 0.5
    >>> image[10:12, 10:12] = 1
    >>> mu = moments_central(image)
    >>> nu = moments_normalized(mu)
    >>> moments_hu(nu)
    array([0.74537037, 0.35116598, 0.10404918, 0.04064421, 0.00264312,
           0.02408546, 0.        ])
    float32Fr   )r   r   rW   float64r   
moments_hur#   )rQ   r   s     r   rY   rY   L  s?    P (i//BJJRZE!"))E)">">???r   c                    t          | d| j        z  d|          }|t          t          j        | j        t
                                       |d| j        z           z  }|S )a4  Return the (weighted) centroid of an image.

    Parameters
    ----------
    image : array
        The input image.
    spacing: tuple of float, shape (ndim,)
        The pixel spacing along each axis of the image.

    Returns
    -------
    center : tuple of float, length ``image.ndim``
        The centroid of the (nonzero) pixels in ``image``.

    Examples
    --------
    >>> image = np.zeros((20, 20), dtype=np.float64)
    >>> image[13:17, 13:17] = 0.5
    >>> image[10:12, 10:12] = 1
    >>> centroid(image)
    array([13.16666667, 13.16666667])
    r1   r   )r(   r   r/   r7   )r3   r)   r   r   eyeint)r4   r/   Mr(   s       r   centroidr^   x  sb    . 	dUZ&7q'RRRA	%uz---
.
./
D5:
	 
 Mr   c                   |t          | d|          }|d| j        z           }t          j        | j        | j        f|j                  }t          dt          j        | j        t                    z            }t          j        |          }d|j	        _
        t          j        ||                   ||         z
  |z  |dd<   t          j        t          | j                  d          D ]q}t          j        | j        t                    }d|t          |          <   |t          |                    |z  ||<   |t          |                    |z  |j        |<   r|S )uT  Compute the inertia tensor of the input image.

    Parameters
    ----------
    image : array
        The input image.
    mu : array, optional
        The pre-computed central moments of ``image``. The inertia tensor
        computation requires the central moments of the image. If an
        application requires both the central moments and the inertia tensor
        (for example, `skimage.measure.regionprops`), then it is more
        efficient to pre-compute them and pass them to the inertia tensor
        call.
    spacing: tuple of float, shape (ndim,)
        The pixel spacing along each axis of the image.

    Returns
    -------
    T : array, shape ``(image.ndim, image.ndim)``
        The inertia tensor of the input image. :math:`T_{i, j}` contains
        the covariance of image intensity along axes :math:`i` and :math:`j`.

    References
    ----------
    .. [1] https://en.wikipedia.org/wiki/Moment_of_inertia#Inertia_tensor
    .. [2] Bernd Jähne. Spatio-Temporal Image Processing: Theory and
           Scientific Applications. (Chapter 8: Tensor Methods) Springer, 1993.
    Nr   r2   r1   r7   Tr   )r3   r)   r   zerosr   r   r[   r\   diagflags	writeabler'   rM   combinationsr$   listT)	r4   rP   r/   rR   resultcorners2ddimsmu_indexs	            r   inertia_tensorrl     sJ   : 
zG
 
 
 TEJ
CXuz5:.bh???F Q
#666677H
AAG F2h<  2h</36AaaaD&uUZ'8'8!<< 4 48EJc222 d5??++c1tU8__--3Mr   c                    |t          | ||          }t          j                            |          }t          j        |dd|          }t          |d          S )ak  Compute the eigenvalues of the inertia tensor of the image.

    The inertia tensor measures covariance of the image intensity along
    the image axes. (See `inertia_tensor`.) The relative magnitude of the
    eigenvalues of the tensor is thus a measure of the elongation of a
    (bright) object in the image.

    Parameters
    ----------
    image : array
        The input image.
    mu : array, optional
        The pre-computed central moments of ``image``.
    T : array, shape ``(image.ndim, image.ndim)``
        The pre-computed inertia tensor. If ``T`` is given, ``mu`` and
        ``image`` are ignored.
    spacing: tuple of float, shape (ndim,)
        The pixel spacing along each axis of the image.

    Returns
    -------
    eigvals : list of float, length ``image.ndim``
        The eigenvalues of the inertia tensor of ``image``, in descending
        order.

    Notes
    -----
    Computing the eigenvalues requires the inertia tensor of the input image.
    This is much faster if the central moments (``mu``) are provided, or,
    alternatively, one can provide the inertia tensor (``T``) directly.
    Nr.   r   )outT)reverse)rl   r   linalgeigvalshclipsorted)r4   rP   rf   r/   eigvalss        r   inertia_tensor_eigvalsru     s`    @ 	y5"g666i  ##G
 ggq$G444G'4((((r   )r	   )Nr	   )r	   N)N)NN)rM   numpyr   _shared.utilsr   r    r   _moments_analyticalr   r   r   r5   r3   rU   rY   r^   rl   ru   r   r   r   <module>rz      sg           ; ; ; ; ; ; ; ;       7 7 7 7 7 7&: &: &: &:Rd d d dN,St ,S ,S ,S ,S ,S^BD B B B B BJ; ; ; ;|)@ )@ )@X  $     @5d 5 5 5 5 5p()d () () () () () () ()r   