o
    hx.                     @   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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_diff r,   ]/var/www/html/scripts/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   r1   dtyper      r5      r7         ?r5   r7   r7   r5   )gffffff?   r   r   spacingr   r      )r   r         -@r   r   r   )r   zerosfloat64r   r   r   )r/   imager>   mr,   r,   r-   test_moments5   s   
"rG   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 )Nr0   r2   r   r4   r6   r8   r9   r:   )r;   r   r<   rA   rA   rA   r   r=   g+=r%   )   rJ   )   rK   )rJ   rK   )rK   rJ   )     0@rL   rL   )r   rC   rD   r   r.   double)r/   rE   r>   mumu_calc_centroidimage2mu2r,   r,   r-   test_moments_centralI   s:   

rR   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 )Nr0   r2   r      rK   c                 S   $   g | ]}t d dD ]}||gq	qS rS   rK   r   .0rcr,   r,   r-   
<listcomp>w   
    z'test_moments_coords.<locals>.<listcomp>)r   rC   rD   r   arrayr   r   r   )rE   mu_imagecoords	mu_coordsr,   r,   r-   test_moments_coordsr   s   ra   r3   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 )Nr0   r2   r   rS   rK   c                 S   rT   rU   rV   rW   r,   r,   r-   r[      r\   z-test_moments_coords_dtype.<locals>.<listcomp>)	r   rC   r   r   r3   r]   r   r   r   )r3   rE   expected_dtyper^   r_   r`   r,   r,   r-   test_moments_coords_dtype}   s   rc   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 )Nr0   r2   r   rS   rK   rH   c                 S   rT   rU   rV   rW   r,   r,   r-   r[      r\   z/test_moments_central_coords.<locals>.<listcomp>rJ   r1   c                 S   rT   )rJ   r1   rV   rW   r,   r,   r-   r[      r\   )r   rC   rD   r   r]   r   r   r   )rE   r^   r_   r`   mu_coords_calc_centroidr,   r,   r-   test_moments_central_coords   s$   





re   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 )Nr0   r2   r   rS   rK   rH   gffffff?   )      '@rg   decimal)r   rC   rD   r   r   r   )rE   rN   nurP   rQ   nu2r,   r,   r-   test_moments_normalized   s   

rl   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 )Nr0   r2   r   rS   rK   r<   r@   r@   )r   r;   )r;      r=   )r   rC   rM   r   r   r.   )r/   rE   spacing1spacing2rN   rj   rQ   rk   r,   r,   r-   test_moments_normalized_spacing   s   rq   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   r;   )r   r;   r   )r;   r   r   )r   	ellipsoidr   r   r   r   r   r   )rE   r^   rj   r_   r`   r,   r,   r-   test_moments_normalized_3d   s   
rt   order)r   r;   r@   rn   r!   )r;   r@   rn   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 )Nr;   )   rv   r@   )@   rw   rw   )rJ   i  iur   rv   r2   )centerru   g-C6?g&.>rI   )r   randomdefault_rngr3   kindintegersstandard_normalr   r	   float32r.   )	r3   ru   r!   r    rngxr#   r$   r%   r,   r,   r-   #test_analytical_moments_calculation   s   r   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 )Nrm   r@   rn   )r   raises
ValueErrorr   r   rC   r,   r,   r,   r-   test_moments_normalized_invalid   s   "r   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 )Nr0   r2   r   rS   r7   rK   g      +@rA   rf   )rg   rf   rh   )r   rC   rD   r   r   r   Tr   )rE   rN   rj   hurP   rQ   rk   hu2r,   r,   r-   test_moments_hu   s   

r   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 )Nr0   r2   r   rS   r7   rK   r   )r   rC   r   r   r3   r   r   )r3   rE   rb   rN   rj   r   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 )Nr0   r2   r   r5   rJ   gUUUUUU?r7   MbP?gh㈵>gHz>)g     ,@rA   )rtol)r   rC   r	   float16r   r   )r3   rE   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   r2   r   r7         #   r?   r<   rB   r   )r   r@   {Gz?g?)r   atol)	r   rC   r   r3   r
   r   r   r   sqrt)r3   rE   rb   r   v0v1r,   r,   r-   test_inertia_tensor_2d'  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 )Nrr   r   r@   )r   r   r      rB   r   )axesru      r   )r   r   r   r   r   )r   r   )r   rs   r
   r   linalgeigargminallclosendirotateastypefloatpicossinr]   )rE   T0eig0V0r   imrotTreigrVrvrr   r   r   Rexpected_vrr,   r,   r-   test_inertia_tensor_3d8  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   )rE   r   )r   r]   r   min)rE   eigvalsr,   r,   r-   test_inertia_tensor_eigvalsP  s   

r   )r   )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parametrizerG   rR   ra   r   r   rD   rc   re   rl   rq   rt   uint8int32r   r   r   r   r   r   r   r   r,   r,   r,   r-   <module>   sH    ,
#

(




