
    9iE                         S SK r S SKrSSKJrJr  SSKJr  SSKJ	r	  SS jr
SS jrSSS	.S
 jjrSSS	.S jjrSS jrS rSS	.S jrSSS	.S jjrSSS	.S jjrg)    N   )_supported_float_typecheck_nD   )_moments_cy)moments_raw_to_centralc                     [        U SUS9$ )a  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/land-doc-ocr/venv/lib/python3.13/site-packages/skimage/measure/_moments.pymoments_coordsr   
   s    L "&!599    c                 v   [        U [        5      (       a  [        R                  " U SS9n [	        U S5        U R
                  S   n[        U R                  5      nUc  [        R                  " U S[        S9nU R                  USS	9U-
  n [        R                  " [        US-   5       Vs/ s H  oPU-  PM	     snSS9n U R                  U R
                  S
US-
  -  -   5      n Sn[        U5       H+  nU SS2U4   n[        R                  " USSU-   5      nXh-  nM-     [        R                  " USS9n	U	$ s  snf )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copy)r   )
isinstancetuplenpstackr   shaper   r   meanfloatastyperangereshapemoveaxissum)
r   centerr
   ndim
float_typeccalcr   isolated_axisMcs
             r   r   r   3   s'   ~ &%   &r*VQ<<?D&v||4J~au5 ]]:E]2V;F XX%	*:;*:Qqy*:;"EF ^^FLL44!8+<<=FDdq$w M1a$h? #  
1	BI) <s   +D6spacingc                2    [        U SU R                  -  XS9$ )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   momentsr0      s    X 5$"35RRr   c                :   Uc  [        XUS9n[        U5      $ [        U R                  5      nUc  [        R
                  " U R                  US9nU R                  USS9n[        U R                  5       H  u  p[        R                  " XS9X8   -  X   -
  n
U
SS2[        R                  4   [        R                  " US-   US9-  n[        R                  " XxU R                  5      n[        R                  " X{5      n[        R                  " USU5      nM     U$ )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.]])
Nr-   r   Fr   r   r   )r0   r   r   r   r   onesr#   r   	enumerater   arangenewaxisrollaxisdot)r/   r"   r
   r*   kwargsmoments_rawfloat_dtyper&   dim
dim_lengthdeltapowers_of_deltas               r   r.   r.      s    b ~ e'B%k22'4K''%**K8<<%<0D$U[[1		*87<G&+U2::."))AI[3
 
 {{4ejj1vvd,{{4S) 2 Kr   c                 T   [         R                  " [         R                  " U R                  5      U:*  5      (       a  [	        S5      eUc   [         R
                  " U R                  5      n[         R                  " U 5      nU R                  5       S   n[        U5      n[        R                  " [        US-   5      U R                  S9 HZ  n[        U5      S:  a  [         R                  X6'   M&  X   U[        U5      -  -  U[        U5      UR                  -  S-   -  -  X6'   M\     U$ )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`r   r   )repeatr   )r   anyarrayr   
ValueErrorr3   r#   
zeros_likeravelmin	itertoolsproductr   r!   nan)mur
   r*   numu0scalepowerss          r   moments_normalizedrP     s    Z 
vvbhhrxx E)**DEE''"''"	r	B
((*Q-CLE##E%!)$4RWWEv;?BJ*uF';;Fbgg-12BJ	 F Ir   c                     U R                   S:X  a  [        R                  O[        R                  n[        R
                  " U R                  USS95      $ )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   rR   float64r   
moments_hur   )rL   r   s     r   rT   rT   L  s=    P ((i/BJJRZZE!!"))E)">??r   c                    [        U SU R                  -  SUS9nU[        [        R                  " U R                  [
        S95         USU R                  -     -  nU$ )a  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])
r,   r   )r"   r
   r*   r2   )r.   r#   r   r   eyeint)r/   r*   Mr"   s       r   centroidrY   x  s[    . 	dUZZ&7q'RA	%uzz-
./
D5::
	 
 Mr   c                   Uc  [        U SUS9nUSU R                  -     n[        R                  " U R                  U R                  4UR                  S9n[        S[        R                  " U R                  [        S9-  5      n[        R                  " U5      nSUR                  l
        [        R                  " X   5      X   -
  U-  USS& [        R                  " [        U R                  5      S5       Hg  n[        R                  " U R                  [        S9nSU[        U5      '   U[        U5         * U-  XG'   U[        U5         * U-  UR                   U'   Mi     U$ )u  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   r-   r,   r2   Tr   )r.   r#   r   zerosr   r   rV   rW   diagflags	writeabler!   rH   combinationsr   listT)	r/   rK   r*   rM   resultcorners2ddimsmu_indexs	            r   inertia_tensorrg     s*   : 
zG
 TEJJ
CXXuzz5::.bhh?F Q

#667H
AAGG FF2< 2</36AaD&&uUZZ'8!<88EJJc2 d5?++c1U8_--3	 =
 Mr   c                    Uc
  [        XUS9n[        R                  R                  U5      n[        R                  " USSUS9n[        USS9$ )a  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)rg   r   linalgeigvalshclipsorted)r/   rK   ra   r*   eigvalss        r   inertia_tensor_eigvalsrp     sM    @ 	y5g6ii  #G
 gggq$G4G'4((r   )   )Nrq   )rq   N)N)NN)rH   numpyr   _shared.utilsr   r    r   _moments_analyticalr   r   r   r0   r.   rP   rT   rY   rg   rp    r   r   <module>rw      sp      ;  7&:RdN,St ,S^BD BJ;|)@X  $ @5d 5p()d ()r   