U
    ?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 d5d	d
Zejddddgdd Zejddddg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d d!d"d#gejd$d!d"d#g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/d0 Z0d1d2 Z1d3d4 Z2dS )6    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sTtt||ksftd| t| < d|t|< t| | dk 	 }t
jt| jd f| j  D ]T}t|| jd d krd| |< d||< qt| | ||  }|| }||k stqd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AssertionErrorallabsmax	itertoolsproductrangeshapendimsum)	m1m2threshZnan_idx1Znan_idx2Zmax_valZordersZabs_diffZrel_diff r&   T/var/www/html/venv/lib/python3.8/site-packages/skimage/measure/tests/test_moments.pycompare_moments   s"     r(   anisotropicFTc                 C   s   t jdt jd}d|d< d|d< d|d< d|d< | r:d	}nd
}| d krPt|}nt||d}t|d d t|d |d  d|d   t|d |d  d|d   d S )N   r+   dtyper      r/      r1         ?r/   r1   r1   r/   )gffffff?   r   r   spacingr   r      )r   r         -@r   r   r   )r   zerosfloat64r   r   r   )r)   imager8   mr&   r&   r'   test_moments5   s    
rA   c                 C   s  t jdt jd}d|d< d|d< d|d< d|d< | r:d	}nd
}| d krZt|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 krt|d}n"t|d|d  d|d  f|d}t||dd d S )Nr*   r,   r   r.   r0   r2   r3   r4   )r5   r   r6   r;   r;   r;   r   r7   g+=r%   )   rD   )   rE   )rD   rE   )rE   rD   )     0@rF   rF   )r   r=   r>   r   r(   double)r)   r?   r8   muZmu_calc_centroidimage2mu2r&   r&   r'   test_moments_centralI   s:    

rK   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      rE   c                 S   s$   g | ]}t d dD ]}||gqqS rL   rE   r   .0rcr&   r&   r'   
<listcomp>w   s     z'test_moments_coords.<locals>.<listcomp>)r   r=   r>   r   arrayr   r   r   )r?   mu_imagecoords	mu_coordsr&   r&   r'   test_moments_coordsr   s    rX   r-   c                 C   s   t jd| d}d|ddddf< t| }t|}|j|ks@tt jdd tddD | d}t|}|j|ksttt	|| d S )Nr*   r,   r   rL   rE   c                 S   s$   g | ]}t d dD ]}||gqqS rM   rN   rO   r&   r&   r'   rS      s     z-test_moments_coords_dtype.<locals>.<listcomp>)
r   r=   r   r   r-   r   rT   r   r   r   )r-   r?   expected_dtyperU   rV   rW   r&   r&   r'   test_moments_coords_dtype}   s    rZ   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   rL   rE   rB   c                 S   s$   g | ]}t d dD ]}||gqqS rM   rN   rO   r&   r&   r'   rS      s     z/test_moments_central_coords.<locals>.<listcomp>rD   r+   c                 S   s$   g | ]}t d dD ]}||gqqS )rD   r+   rN   rO   r&   r&   r'   rS      s     )r   r=   r>   r   rT   r   r   r   )r?   rU   rV   rW   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   rL   rE   rB   gffffff?   )      '@r]   decimal)r   r=   r>   r   r   r   )r?   rH   nurI   rJ   nu2r&   r&   r'   test_moments_normalized   s    

rb   c                 C   sx   t jdt jd}d|ddddf< | s2d}d}nd}d	}t||d
}t||d
}t||d
}t||d
}t|| d S )Nr*   r,   r   rL   rE   r6   r:   r:   )r   r5   )r5      r7   )r   r=   rG   r   r   r(   )r)   r?   Zspacing1Zspacing2rH   r`   rJ   ra   r&   r&   r'   test_moments_normalized_spacing   s    re   c                  C   sd   t ddd} t| }t|}|d |d ks2tt|d |d  t| }t|}t|| d S )Nr   
   )r   r   r5   )r   r5   r   )r5   r   r   )	r   	ellipsoidr   r   r   r   r   r   r   )r?   rU   r`   rV   rW   r&   r&   r'   test_moments_normalized_3d   s    
rh   orderr   r5   r:   rd   r!   c           	      C   s   |dkrd}n|dkrd}nd| }t jd}t | jdkrT|jdd	|| d
}n|j|| d
}t|d |d}t|t||d}|jt j	krdnd}t
|||d d S )Nr5   )   rj   r:   )@   rk   rk   )rD   i  iur   rj   r,   )centerri   g-C6?g&.>rC   )r   randomZdefault_rngr-   kindZintegersZstandard_normalr   r	   float32r(   )	r-   ri   r!   r    rngxr#   r$   r%   r&   r&   r'   #test_analytical_moments_calculation   s    rs   c                	   C   sP   t t ttdd W 5 Q R X t t ttdd W 5 Q R X d S )Nrc   r:   rd   )r   Zraises
ValueErrorr   r   r=   r&   r&   r&   r'   test_moments_normalized_invalid   s    ru   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   rL   r1   rE   g      +@r;   r\   )r]   r\   r^   )r   r=   r>   r   r   r   Tr   )r?   rH   r`   hurI   rJ   ra   Zhu2r&   r&   r'   test_moments_hu   s    

ry   c                 C   sr   t jd| d}d|ddddf< t| }t|d}|j|ksBtt|}|j|ksXtt|}|j|ksntd S )Nr*   r,   r   rL   r1   rE   rv   )r   r=   r   r   r-   r   r   r   )r-   r?   rY   rH   r`   rx   r&   r&   r'   test_moments_dtype  s    
rz   c                 C   sl   t jd| d}d|dddf< d|dddf< t|}| t jkrFd}n| t jkrVd	}nd
}t|d|d d S )Nr*   r,   r   r/   rD   gUUUUUU?r1   MbP?gh㈵>gHz>)g     ,@r;   )rtol)r   r=   r	   float16rp   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sBt|d |d	 ksVtt j|d
 d t||d\}}|j|kst|j|kstt jjt 	|| dddd d S )N)(   r   r,   r   r1         #   r9   r6   r<   r   )rw   r:   {Gz?g?)r|   atol)
r   r=   r   r-   r
   r   r   r   r   sqrt)r-   r?   rY   rw   v0Zv1r&   r&   r'   test_inertia_tensor_2d'  s    
r   c                  C   s@  t ddd} t| }tj|\}}|d d t|f }t|dddgsft| dddgsft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dddgg}|| }tj|	|d
dds<tj|	 |d
dds<td S )Nrf   r   r:   r   r      r<   )Zaxesri      r{   r   )r   r|   )r   rg   r
   r   ZlinalgZeigZargminZallcloser   ndirotateZastypefloatpicossinrT   )r?   ZT0Zeig0ZV0r   ZimrotZTrZeigrZVrZvrr   r   r   RZexpected_vrr&   r&   r'   test_inertia_tensor_3d8  s$    *r   c                  C   s   t dddddddddddddddgdddddddddddddddgdddddddddddddddgg} t| d}t|dkstd S )Nr   r   )r?   )r   rT   r   minr   )r?   Zeigvalsr&   r&   r'   test_inertia_tensor_eigvalsP  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parametrizerA   rK   rX   r}   rp   r>   rZ   r[   rb   re   rh   Zuint8Zint32rs   ru   ry   rz   r~   r   r   r   r&   r&   r&   r'   <module>   sF   ,
#

(




