o
    j-                     @   s  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 d4d	d
Zejdg ddd Zejdg ddd Zdd Z ejdej!ej"ej#gdd Z$dd Z%dd Z&ejdddgdd Z'dd Z(ejdej)ej*ej"ej#gejd g d!ejd"g d#d$d% Z+d&d' Z,d(d) Z-ejdej!ej"ej#gd*d+ Z.ejdej!ej"ej#gd,d- Z/ejdej!ej"ej#gd.d/ Z0d0d1 Z1d2d3 Z2dS )5    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_normalized:0yE>c           	      C   s  |   } |  }tt|  d }tt| d }t|t|ks*J t||ks3J d| t| < d|t|< t| | dk  }t	j
t| jd f| j  D ]*}t|| jd d krpd| |< d||< qZt| | ||  }|| }||k sJ qZdS )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isnanZravellenallabsmax	itertoolsproductrangeshapendimsum)	m1m2threshZnan_idx1Znan_idx2Zmax_valZordersZabs_diffZrel_diff r%   c/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/skimage/measure/tests/test_moments.pycompare_moments   s$    r'   anisotropic)FTNc                 C   s   t jdt jd}d|d< d|d< d|d< d|d< | rd	}nd
}| d u r(t|}nt||d}t|d d t|d |d  d|d   t|d |d  d|d   d S )N   r*   dtyper      r.      r0         ?r.   r0   r0   r.   )gffffff?   r   r   spacingr   r      )r   r         -@r   r   r   )r   zerosfloat64r   r   r   )r(   imager7   mr%   r%   r&   test_moments;   s   
"r@   c                 C   s  t jdt jd}d|d< d|d< d|d< d|d< | rd	}nd
}| d u r-t|d}t|}nt|d|d  d|d  f|d}t||d}t||dd t jdt jd}d|d< d|d< d|d< d|d< | d u rmt|d}nt|d|d  d|d  f|d}t||dd d S )Nr)   r+   r   r-   r/   r1   r2   r3   )r4   r   r5   r:   r:   r:   r   r6   g+=r$   )   rC   )   rD   )rC   rD   )rD   rC   )     0@rE   rE   )r   r<   r=   r   r'   double)r(   r>   r7   muZmu_calc_centroidimage2mu2r%   r%   r&   test_moments_centralO   s6   

rJ   c                  C   sb   t jdt jd} d| ddddf< t| }t jdd tddD t jd}t|}t|| d S )Nr)   r+   r      rD   c                 S   $   g | ]}t d dD ]}||gq	qS rK   rD   r   .0rcr%   r%   r&   
<listcomp>}      $ z'test_moments_coords.<locals>.<listcomp>)r   r<   r=   r   arrayr   r   r   )r>   mu_imagecoords	mu_coordsr%   r%   r&   test_moments_coordsw   s   rY   r,   c                 C   s   t jd| d}d|ddddf< t| }t|}|j|ks J t jdd tddD | d}t|}|j|ks:J t|| d S )Nr)   r+   r   rK   rD   c                 S   rL   rM   rN   rO   r%   r%   r&   rS      rT   z-test_moments_coords_dtype.<locals>.<listcomp>)	r   r<   r   r   r,   rU   r   r   r   )r,   r>   expected_dtyperV   rW   rX   r%   r%   r&   test_moments_coords_dtype   s   r[   c                  C   s   t jdt jd} d| ddddf< t| d}t jdd tddD t jd}t|d}t|| t|}t|| t jdt jd} d| d	d
d	d
f< t| d}t jdd td	d
D t jd}t|d}t|| d S )Nr)   r+   r   rK   rD   rA   c                 S   rL   rM   rN   rO   r%   r%   r&   rS      rT   z/test_moments_central_coords.<locals>.<listcomp>rC   r*   c                 S   rL   )rC   r*   rN   rO   r%   r%   r&   rS      rT   )r   r<   r=   r   rU   r   r   r   )r>   rV   rW   rX   Zmu_coords_calc_centroidr%   r%   r&   test_moments_central_coords   s$   





r\   c                  C   s~   t jdt jd} d| ddddf< t| d}t|}t jdt jd}d|ddddf< t|d	}t|}t||dd
 d S )Nr)   r+   r   rK   rD   rA   gffffff?   )      '@r^   decimal)r   r<   r=   r   r   r   )r>   rG   nurH   rI   nu2r%   r%   r&   test_moments_normalized   s   

rc   FTc                 C   sx   t jdt jd}d|ddddf< | sd}d}nd}d	}t||d
}t||d
}t||d
}t||d
}t|| d S )Nr)   r+   r   rK   rD   r5   r9   r9   )r   r4   )r4      r6   )r   r<   rF   r   r   r'   )r(   r>   Zspacing1Zspacing2rG   ra   rI   rb   r%   r%   r&   test_moments_normalized_spacing   s   rf   c                  C   sd   t ddd} t| }t|}|d |d ksJ t|d |d  t| }t|}t|| d S )Nr   
   )r   r   r4   )r   r4   r   )r4   r   r   )r   	ellipsoidr   r   r   r   r   r   )r>   rV   ra   rW   rX   r%   r%   r&   test_moments_normalized_3d   s   
ri   order)r   r4   r9   re   r    )r4   r9   re   c           	      C   s   |dkrd}n|dkrd}nd| }t jd}t | jdv r*|jdd	|| d
}n|j|| d
}t|d |d}t|t||d}|jt j	krIdnd}t
|||d d S )Nr4   )   rk   r9   )@   rl   rl   )rC   i  iur   rk   r+   )centerrj   ga2U0*#?g&.>rB   )r   randomZdefault_rngr,   kindZintegersZstandard_normalr   r	   float32r'   )	r,   rj   r    r   rngxr"   r#   r$   r%   r%   r&   #test_analytical_moments_calculation   s   rt   c                   C   sz   t t ttdd W d    n1 sw   Y  t t ttdd W d    d S 1 s6w   Y  d S )Nrd   r9   re   )r   Zraises
ValueErrorr   r   r<   r%   r%   r%   r&   test_moments_normalized_invalid   s   "rv   c                  C   s   t jdt jd} d| ddddf< t| d}t|}t|}t jdt jd}d|dddf< |j}t|d	}t|}t|}t||dd
 d S )Nr)   r+   r   rK   r0   rD   g      +@r:   r]   )r^   r]   r_   )r   r<   r=   r   r   r   Tr   )r>   rG   ra   hurH   rI   rb   Zhu2r%   r%   r&   test_moments_hu  s   

rz   c                 C   sr   t jd| d}d|ddddf< t| }t|d}|j|ks!J t|}|j|ks,J t|}|j|ks7J d S )Nr)   r+   r   rK   r0   rD   rw   )r   r<   r   r   r,   r   r   )r,   r>   rZ   rG   ra   ry   r%   r%   r&   test_moments_dtype  s   
r{   c                 C   sl   t jd| 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|d d S )Nr)   r+   r   r.   rC   gUUUUUU?r0   MbP?gh㈵>gHz>)g     ,@r:   )rtol)r   r<   r	   float16rq   r   )r,   r>   Zimage_centroidr}   r%   r%   r&   test_centroid"  s   

r   c                 C   s   t jd| d}d|ddddf< t|j}t|}|j|ks!J |d |d	 ks+J t j|d
 d t||d\}}|j|ksCJ |j|ksJJ t jjt || dddd d S )N)(   r   r+   r   r0         #   r8   r5   r;   r   )rx   r9   {Gz?g?)r}   atol)	r   r<   r   r,   r
   r   r   r   sqrt)r,   r>   rZ   rx   v0Zv1r%   r%   r&   test_inertia_tensor_2d1  s   
"r   c                  C   s:  t ddd} t| }tj|\}}|d d t|f }t|g ds1t| g ds1J tj	| 
tdddd}t|}tj|\}}|d d t|f }	tjtjtj}
}}t||
d	 ||
d	  d
g||
d	 ||
d	 d
gg dg}|| }tj|	|dddstj|	 |dddsJ d S d S )Nrg   r   r9   )r   r   r      r;   r   )Zaxesrj      r   )r   r   r   r|   r   )r   r}   )r   rh   r
   r   ZlinalgZeigZargminZallclosendirotateZastypefloatpicossinrU   )r>   ZT0Zeig0ZV0r   ZimrotZTrZeigrZVrZvrr   r   r   RZexpected_vrr%   r%   r&   test_inertia_tensor_3dB  s"   &:
r   c                  C   s:   t g dg dg dg} t| d}t|dksJ d S )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   )r>   r   )r   rU   r   min)r>   Zeigvalsr%   r%   r&   test_inertia_tensor_eigvals[  s   
r   )r   )3r   numpyr   ZpytestZscipyr   r   Zskimager   Zskimage._sharedr   Zskimage._shared.testingr   r   r   Zskimage._shared.utilsr   Zskimage.measurer	   r
   r   r   r   r   r   r   r   r'   markZparametrizer@   rJ   rY   r~   rq   r=   r[   r\   rc   rf   ri   Zuint8Zint32rt   rv   rz   r{   r   r   r   r   r%   r%   r%   r&   <module>   sH    ,
#

'




