
    9i-                        S SK r S SKrS SKrS SKJr  S SKJr  S SK	J
r
  S SKJrJrJr  S SKJr  S SKJrJrJrJrJrJrJrJrJr  S"S jr\R8                  R;                  S	/ S
Q5      S 5       r\R8                  R;                  S	/ S
Q5      S 5       rS r \R8                  R;                  S\RB                  \RD                  \RF                  /5      S 5       r$S r%S r&\R8                  R;                  S	SS/5      S 5       r'S r(\R8                  R;                  S\RR                  \RT                  \RD                  \RF                  /5      \R8                  R;                  S/ SQ5      \R8                  R;                  S/ SQ5      S 5       5       5       r+S r,S r-\R8                  R;                  S\RB                  \RD                  \RF                  /5      S 5       r.\R8                  R;                  S\RB                  \RD                  \RF                  /5      S 5       r/\R8                  R;                  S\RB                  \RD                  \RF                  /5      S 5       r0S  r1S! r2g)#    N)ndimage)draw)testing)assert_allcloseassert_almost_equalassert_equal)_supported_float_type)	centroidinertia_tensorinertia_tensor_eigvalsmomentsmoments_centralmoments_coordsmoments_coords_central
moments_humoments_normalizedc                 `   U R                  5       n UR                  5       n[        R                  " [        R                  " U R	                  5       5      5      S   n[        R                  " [        R                  " UR	                  5       5      5      S   n[        U5      [        U5      :X  d   e[        R                  " X4:H  5      (       d   eSU [        R                  " U 5      '   SU[        R                  " U5      '   [        R                  " X S:g     5      R                  5       n[        R                  " [        U R                  S   5      4U R                  -  6  HI  n[        U5      U R                  S   S-
  :  a
  SX'   SX'   M,  [        X   X   -
  5      nXu-  nX:  a  MI   e   g)a  Compare two moments arrays.

Compares only values in the upper-left triangle of m1, m2 since
values below the diagonal exceed the specified order and are not computed
when the analytical computation is used.

Also, there the first-order central moments will be exactly zero with the
analytical calculation, but will not be zero due to limited floating point
precision when using a numerical computation. Here we just specify the
tolerance as a fraction of the maximum absolute value in the moments array.
r      N)copynpwhereisnanravellenallabsmax	itertoolsproductrangeshapendimsum)	m1m2threshnan_idx1nan_idx2max_valordersabs_diffrel_diffs	            b/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/skimage/measure/tests/test_moments.pycompare_momentsr.      sN    
B	B xx,-a0Hxx,-a0Hx=CM)))66(&''''Brxx|Brxx|ffRa[!%%'G##uRXXa['9&;bgg&EGv;!q(BJBJrzBJ./%    H    anisotropic)FTNc                 D   [         R                  " S[         R                  S9nSUS'   SUS'   SUS'   SUS'   U (       a  S	nOS
nU c  [        U5      nO	[        XS9n[	        US   S5        [        US   US   -  SUS   -  5        [        US   US   -  SUS   -  5        g )N   r3   dtyper      r7      r9         ?r7   r9   r9   r7   )gffffff?   r   r   spacingr   r      )r   r         -@r   r   r   )r   zerosfloat64r   r   r   )r0   imager@   ms       r-   test_momentsrI   ;   s    HHXRZZ0EE&ME&ME&ME&MENE+4!$!D')4'!*+<=$!D')4'!*+<=r/   c                    [         R                  " S[         R                  S9nSUS'   SUS'   SUS'   SUS'   U (       a  S	nOS
nU c  [        US5      n[        U5      nO"[        USUS   -  SUS   -  4US9n[        XS9n[	        X4SS9  [         R                  " S[         R
                  S9nSUS'   SUS'   SUS'   SUS'   U c  [        US5      nO[        USUS   -  SUS   -  4US9n[	        X6SS9  g )Nr2   r4   r   r6   r8   r:   r;   r<   )r=   r   r>   rC   rC   rC   r   r?   g+=r&   )   rM   )   rN   )rM   rN   )rN   rM   )     0@rO   rO   )r   rE   rF   r   r.   double)r0   rG   r@   mumu_calc_centroidimage2mu2s          r-   test_moments_centralrU   O   s%   HHXRZZ0EE&ME&ME&ME&MUL1*51D71:%tgaj'897
 +5BB7 XXhbii0FF6NF6NF6NF6Nf&:;h'!*,x71:.EFPW
 BE*r/   c            
      X   [         R                  " S[         R                  S9n SU SS2SS24'   [        U 5      n[         R                  " [        SS5       VVs/ s H  n[        SS5        H  o2U/PM     M     snn[         R                  S9n[        U5      n[        XQ5        g s  snnf Nr2   r4   r      rN   )r   rE   rF   r   arrayr    r   r   )rG   mu_imagerccoords	mu_coordss         r-   test_moments_coordsr_   w   s    HHXRZZ0EE"R%B,u~HXXr2>Ab"1Q>bjjF v&I	, 	?s   !B&
r5   c           
      ~   [         R                  " SU S9nSUSS2SS24'   [        U 5      n[        U5      nUR                  U:X  d   e[         R
                  " [        SS5       VVs/ s H  n[        SS5        H  oTU/PM     M     snnU S9n[        U5      nUR                  U:X  d   e[        Xs5        g s  snnf rW   )	r   rE   r	   r   r5   rY   r    r   r   )r5   rG   expected_dtyperZ   r[   r\   r]   r^   s           r-   test_moments_coords_dtyperb      s    HHXU+EE"R%B,*51Nu~H>>^+++XXr2>Ab"1Q>eF v&I??n,,,	, 	?s   (!B9
c            
         [         R                  " S[         R                  S9n SU SS2SS24'   [        U S5      n[         R                  " [        SS5       VVs/ s H  n[        SS5        H  o2U/PM     M     snn[         R                  S9n[        US5      n[        XQ5        [        U5      n[        Xe5        [         R                  " S[         R                  S9n SU SS2SS24'   [        U S5      n[         R                  " [        SS5       VVs/ s H  n[        SS5        H  o2U/PM     M     snn[         R                  S9n[        US5      n[        XQ5        g s  snnf s  snnf )	Nr2   r4   r   rX   rN   rK   rM   r3   )r   rE   rF   r   rY   r    r   r   )rG   rZ   r[   r\   r]   r^   mu_coords_calc_centroids          r-   test_moments_central_coordsre      s4   HHXRZZ0EE"R%B,ul3HXXr2>Ab"1Q>bjjF 'v|<I	, 5V</; HHXRZZ0EE"R%B,ul3HXXr2>Ab"1Q>bjjF 'v|<I	,% 	? 	?s   !E$
!E*
c                  ,   [         R                  " S[         R                  S9n SU SS2SS24'   [        U S5      n[	        U5      n[         R                  " S[         R                  S9nSUSS2SS24'   [        US	5      n[	        U5      n[        X%SS
9  g )Nr2   r4   r   rX   rN   rK   gffffff?   )      '@rh   decimal)r   rE   rF   r   r   r   )rG   rQ   nurS   rT   nu2s         r-   test_moments_normalizedrm      s    HHXRZZ0EE"R%B,		-B	B	BXXhbjj1FF2b5"R%<
&,
/C
S
!C+r/   FTc                     [         R                  " S[         R                  S9nSUSS2SS24'   U (       d  SnSnOSnS	n[        XS
9n[	        XBS
9n[        XS
9n[	        XcS
9n[        XW5        g )Nr2   r4   r   rX   rN   r>   rB   rB   )r   r=   )r=      r?   )r   rE   rP   r   r   r.   )r0   rG   spacing1spacing2rQ   rk   rT   rl   s           r-   test_moments_normalized_spacingrs      su    HHXRYY/EE"R%B,		1B	B	1B
%
2C
S
3C Br/   c                      [         R                  " SSS5      n [        U 5      n[        U5      nUS   US   :  d   e[	        US   US   5        [
        R                  " U 5      n[        U5      n[	        X5        g )Nr   
   )r   r   r=   )r   r=   r   )r=   r   r   )r   	ellipsoidr   r   r   r   r   r   )rG   rZ   rk   r]   r^   s        r-   test_moments_normalized_3drw      so    NN1a$Eu%H	H	%Bg;G$$$7R[1XXe_F&v.I,r/   order)r   r=   rB   rp   r"   )r=   rB   rp   c                    US:X  a  SnOUS:X  a  SnOSU-  n[         R                  R                  S5      n[         R                  " U 5      R                  S;   a  UR                  SS	X0S
9nOUR                  X0S
9n[        US US9n[        U[        U5      US9nUR                  [         R                  :X  a  SOSn[        XgUS9  g )Nr=   )   rz   rB   )@   r{   r{   )rM   i  iur   rz   r4   )centerrx   ga2U0*#?g&.>rL   )r   randomdefault_rngr5   kindintegersstandard_normalr   r
   float32r.   )	r5   rx   r"   r!   rngxr$   r%   r&   s	            r-   #test_analytical_moments_calculationr      s     qy	
))


%C	xxt#LLCL43	4u	5B	8A;e	<B ww"**,V$FB6*r/   c                  T   [         R                  " [        5         [        [        R
                  " S5      S5        S S S 5        [         R                  " [        5         [        [        R
                  " S5      S5        S S S 5        g ! , (       d  f       NR= f! , (       d  f       g = f)Nro   rB   rp   )r   raises
ValueErrorr   r   rE    r/   r-   test_moments_normalized_invalidr      s]    	
	#288F+Q/ 
$	
	#288F+Q/ 
$	# 
$	#	#	#s   !B!B
B
B'c                  l   [         R                  " S[         R                  S9n SU SS2SS24'   [        U S5      n[	        U5      n[        U5      n[         R                  " S[         R                  S9nSUSSS24'   UR                  n[        US	5      n[	        U5      n[        U5      n[        X7SS
9  g )Nr2   r4   r   rX   r9   rN   g      +@rC   rg   )rh   rg   ri   )r   rE   rF   r   r   r   Tr   )rG   rQ   rk   hurS   rT   rl   hu2s           r-   test_moments_hur     s    HHXRZZ0EE"R%B,		-B	B	B	BBXXhbjj1FF2r"u9XXF
&*
-C
S
!C
S/C+r/   c                 
   [         R                  " SU S9nSUSS2SS24'   [        U 5      n[        US5      nUR                  U:X  d   e[        U5      nUR                  U:X  d   e[        U5      nUR                  U:X  d   eg )Nr2   r4   r   rX   r9   rN   r   )r   rE   r	   r   r5   r   r   )r5   rG   ra   rQ   rk   r   s         r-   test_moments_dtyper     s    HHXU+EE"R%B,*51N		-B88~%%%	B	B88~%%%	BB88~%%%r/   c                     [         R                  " SU S9nSUSSS24'   SUSSS24'   [        U5      nU [         R                  :X  a  SnOU [         R                  :X  a  S	nOS
n[        USUS9  g )Nr2   r4   r   r7   rM   gUUUUUU?r9   MbP?gh㈵>gHz>)g     ,@rC   )rtol)r   rE   r
   float16r   r   )r5   rG   image_centroidr   s       r-   test_centroidr   "  sr    HHXU+EE"be)E"be)e_N

	"**	NM=r/   c                    [         R                  " SU S9nSUSS2SS24'   [        UR                  5      n[	        U5      nUR                  U:X  d   eUS   US	   :  d   e[         R
                  R                  US
   S5        [        XS9u  pEUR                  U:X  d   eUR                  U:X  d   e[         R
                  R                  [         R                  " XE-  5      SSSS9  g )N)(   r   r4   r   r9         #   rA   r>   rD   r   )r   rB   {Gz?g?)r   atol)	r   rE   r	   r5   r   r   r   r   sqrt)r5   rG   ra   r   v0v1s         r-   test_inertia_tensor_2dr   1  s    HHXU+EE"R%2+*5;;7NuA77n$$$T7QtWJJqw*#E/FB88~%%%88~%%%JJrwwrw/DIr/   c                     [         R                  " SSS5      n [        U 5      n[        R                  R                  U5      u  p#US S 2[        R                  " U5      4   n[        R                  " U/ SQ5      (       d!  [        R                  " U* / SQ5      (       d   e[        R                  " U R                  [        5      SSSS9n[        U5      n[        R                  R                  U5      u  pxUS S 2[        R                  " U5      4   n	[        R                  [        R                  [        R                  pn
[        R                  " U" U
S	-  5      U" U
S	-  5      * S
/U" U
S	-  5      U" U
S	-  5      S
// SQ/5      nX-  n[        R                  " XSSS9(       d   [        R                  " U	* USSS9(       d   eg g )Nru   r   rB   )r   r   r      rD   r   )axesrx      r   )r   r   r   r   r   )r   r   )r   rv   r   r   linalgeigargminallclosendirotateastypefloatpicossinrY   )rG   T0eig0V0r   imrotTreigrVrvrr   r   r   Rexpected_vrs                  r-   test_inertia_tensor_3dr   B  sh   NN2q!$E		Byy}}R HD	Aryy	B;;r9%%bS))D)DDDJJu||E*BV1EE		Byy}}R HD	Aryy	B 55"&&"&&SB

b1f+BF|Q	'#b1f+s26{A)F	R	A &K;;rT=	[t$B   B=r/   c                  v    [         R                  " / SQ/ SQ/ SQ/5      n [        U S9n[        U5      S:  d   eg )N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rG   r   )r   rY   r   min)rG   eigvalss     r-   test_inertia_tensor_eigvalsr   [  s>     HH999	
E %51Gw<1r/   )g:0yE>)3r   numpyr   pytestscipyr   r   skimager   skimage._sharedr   skimage._shared.testingr   r   r   skimage._shared.utilsr	   skimage.measurer
   r   r   r   r   r   r   r   r   r.   markparametrizerI   rU   r_   r   r   rF   rb   re   rm   rs   rw   uint8int32r   r   r   r   r   r   r   r   r   r/   r-   <module>r      s*         # V V 7
 
 
 !F (;<> =>& (;<$+ =$+N	- 2::rzz2::"FG- H-"-6, 6 7*	- 288RXXrzz2::"NO,/++ , 0 P+,0," 2::rzz2::"FG& H& 2::rzz2::"FG> H> 2::rzz2::"FGJ HJ 2r/   