
    |h-                        d dl Z d dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZ d"dZej8                  j;                  d	g d
      d        Zej8                  j;                  d	g d
      d        Zd Z ej8                  j;                  dejB                  ejD                  ejF                  g      d        Z$d Z%d Z&ej8                  j;                  d	ddg      d        Z'd Z(ej8                  j;                  dejR                  ejT                  ejD                  ejF                  g      ej8                  j;                  dg d      ej8                  j;                  dg d      d                      Z+d Z,d Z-ej8                  j;                  dejB                  ejD                  ejF                  g      d        Z.ej8                  j;                  dejB                  ejD                  ejF                  g      d        Z/ej8                  j;                  dejB                  ejD                  ejF                  g      d        Z0d  Z1d! Z2y)#    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                 H   | j                         } |j                         }t        j                  t        j                  | j	                                     d   }t        j                  t        j                  |j	                                     d   }t        |      t        |      k(  sJ t        j                  ||k(        sJ d| t        j                  |       <   d|t        j                  |      <   t        j                  | | dk7           j                         }t        j                  t        | j                  d         f| j                  z   D ]K  }t        |      | j                  d   dz
  kD  rd| |<   d||<   ,t        | |   ||   z
        }||z  }||k  rKJ  y)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	            a/var/www/html/test/engine/venv/lib/python3.12/site-packages/skimage/measure/tests/test_moments.pycompare_momentsr.      s_    
B	B xx,-a0Hxx,-a0Hx=CM)))66(h&'''Brxx|Brxx|ffRa[!%%'G##uRXXa['9&;bgg&EG !v;!q(BvJBvJr&zBvJ./g%&   !    anisotropic)FTNc                 D   t        j                  dt         j                        }d|d<   d|d<   d|d<   d|d<   | rd	}nd
}| t        |      }nt        ||      }t	        |d   d       t        |d   |d   z  d|d   z         t        |d   |d   z  d|d   z         y )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E7+4!$!D')4'!*+<=$!D')4'!*+<=r/   c                 
   t        j                  dt         j                        }d|d<   d|d<   d|d<   d|d<   | rd	}nd
}| t        |d      }t        |      }n)t        |d|d   z  d|d   z  f|      }t        ||      }t	        ||d       t        j                  dt         j
                        }d|d<   d|d<   d|d<   d|d<   | t        |d      }nt        |d|d   z  d|d   z  f|      }t	        ||d       y )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
 BE*r/   c            
      X   t        j                  dt         j                        } d| ddddf<   t        |       }t        j                  t        dd      D cg c]  }t        dd      D ]  }||g  c}}t         j                        }t        |      }t        ||       y c c}}w 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">1!Q>>bjjF v&I	8, 	?s   B&
r5   c           
      z   t        j                  d|       }d|ddddf<   t        |       }t        |      }|j                  |k(  sJ t        j
                  t        dd      D cg c]  }t        dd      D ]  }||g  c}}|       }t        |      }|j                  |k(  sJ t        ||       y c c}}w 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">1!Q>>eF v&I??n,,,	8, 	?s   (B7
c            
         t        j                  dt         j                        } d| ddddf<   t        | d      }t        j                  t        dd      D cg c]  }t        dd      D ]  }||g  c}}t         j                        }t        |d      }t        ||       t        |      }t        ||       t        j                  dt         j                        } d| ddddf<   t        | d      }t        j                  t        dd      D cg c]  }t        dd      D ]  }||g  c}}t         j                        }t        |d      }t        ||       y c c}}w c c}}w )	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      s>   HHXRZZ0EE"R%B,ul3HXXr2>Ab">1!Q>>bjjF 'v|<I	8, 5V</; HHXRZZ0EE"R%B,ul3HXXr2>Ab">1!Q>>bjjF 'v|<I	8,% 	? 	?s   E%
E+
c                  <   t        j                  dt         j                        } d| ddddf<   t        | d      }t	        |      }t        j                  dt         j                        }d|ddddf<   t        |d	      }t	        |      }t        ||d
       y )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C+r/   FTc                     t        j                  dt         j                        }d|ddddf<   | sd}d}nd}d	}t        ||
      }t	        ||
      }t        ||
      }t	        ||
      }t        ||       y )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      s    HHXRYY/EE"R%B,		1B	B	1B
%
2C
S(
3C Br/   c                      t        j                  ddd      } t        |       }t        |      }|d   |d   kD  sJ t	        |d   |d          t        j                  |       }t        |      }t	        ||       y )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      sq    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                    |dk(  rd}n|dk(  rd}nd|z  }t         j                  j                  d      }t        j                  |       j                  dv r|j                  dd	|| 
      }n|j                  || 
      }t        |d |      }t        |t        |      |      }|j                  t         j                  k(  rdnd}t        |||       y )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eL4U3	4u	5B	8A;e	<B ww"**,V$FB6*r/   c                  8   t        j                  t              5  t        t	        j
                  d      d       d d d        t        j                  t              5  t        t	        j
                  d      d       d d d        y # 1 sw Y   KxY w# 1 sw Y   y xY w)Nro   rB   rp   )r   raises
ValueErrorr   r   rE    r/   r-   test_moments_normalized_invalidr      so    	
	# 0288F+Q/0	
	# 0288F+Q/0 00 00 0s    B BBBc                  |   t        j                  dt         j                        } d| ddddf<   t        | d      }t	        |      }t        |      }t        j                  dt         j                        }d|dddf<   |j                  }t        |d	      }t	        |      }t        |      }t        ||d
       y )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C+r/   c                    t        j                  d|       }d|ddddf<   t        |       }t        |d      }|j                  |k(  sJ t        |      }|j                  |k(  sJ t        |      }|j                  |k(  sJ y )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                     t        j                  d|       }d|dddf<   d|dddf<   t        |      }| t         j                  k(  rd}n| t         j                  k(  rd	}nd
}t        |d|       y )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                    t        j                  d|       }d|ddddf<   t        |j                        }t	        |      }|j                  |k(  sJ |d   |d	   kD  sJ t         j
                  j                  |d
   d       t        ||      \  }}|j                  |k(  sJ |j                  |k(  sJ t         j
                  j                  t        j                  ||z        ddd       y )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*#EQ/FB88~%%%88~%%%JJrwwrBw/DIr/   c                  t   t        j                  ddd      } t        |       }t        j                  j                  |      \  }}|d d t        j                  |      f   }t        j                  |g d      st        j                  | g d      sJ t        j                  | j                  t              ddd      }t        |      }t        j                  j                  |      \  }}|d d t        j                  |      f   }	t        j                  t        j                  t        j                  }}}
t        j                   ||
d	z         ||
d	z         d
g ||
d	z         ||
d	z        d
gg dg      }||z  }t        j                  |	|dd      st        j                  |	 |dd      sJ y y )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  sl   NN2q!$E		Byy}}R HD"	Aryy	B;;r9%bS))DDDJJu||E*BV1EE		Byy}}R HD"	Aryy	B 55"&&"&&SB

b1f+BF|Q	'#b1f+s26{A)F	R	A b&K;;r;T=	[t$B   B=r/   c                  x    t        j                  g dg dg dg      } t        |       }t        |      dk\  sJ y )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/   