U
    hp<                     @   sL  d dl Zd dlZd dlmZ d dlmZmZm	Z	 d dl
mZmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ ejd	d
 Zejdd ZG dd dZG dd dZejejejej ej!ej"gZ#ej$%de#dd Z&dd Z'ej ejgZ(ej$%de(dd Z)dd Z*dd Z+dd Z,e-ddd d!d"gd#d$d%d&d'gd(d)d*d+d,gd-d.d/d0d1gd2d3d4d0d5ggZ.e-dd$d!d"d'gd$d$d$d'd,gd-d.d)d,d,gd.d.d.d0d,gd-d.d4d5d5ggZ/e-ddd%d&d!gd(d%d&d&d&gd(d(d+d&d+gd2d/d/d+d1gd2d2d/d0d1ggZ0e-ddd!d!d"gdd$d!d$d'gd$d)d)d0d,gd-d.d0d0d0gd-d4d4d0d5ggZ1e-dddd!d!gddd%d&d!gd(d(d(d+d1gd(d(d/d0d1gd2d/d0d0d0ggZ2d6d7 Z3d8d9 Z4d:d; Z5d<d= Z6ej$%dd>d?d@dAdBdCgej$%dDdEej$%dFdGdHgdIdJ Z7ej$%dd>d?d@dAdBdCgej$%dKdLej$%dMdLej$%dFdGdHgdNdO Z8ej$%dd>d?d@dAdBdCgej$%dPdQej$%dFdHgdRdS Z9ej$%dd>d?d@dAdBdCgej$%dTdUej$%dVdWej$%dFdHgdXdY Z:ej$%dd>d?d@dAdBdCgej$%dDdZej$%dFdGdHgd[d\ Z;ej$%dd>d?d@dAdBdCgej$%dPd]ej$%dFdHgd^d_ Z<dS )`    N)ndimage)assert_allcloseassert_array_equalassert_equal)colordata	transform)expected_warnings)fetch)gray
footprints)img_as_uintimg_as_ubytec                  C   s*   ddl m}  t|  ddddf S )Nr   r   @   p   `   )skimager   npascontiguousarrayZcamerar    r   F/tmp/pip-unpacked-wheel-gtraehzf/skimage/morphology/tests/test_gray.py	cam_image   s    r   c                  C   s2   ddl m}  t|  dddddddf S )Nr   r      0      $       )r   r   r   r   Zcells3dr   r   r   r   cell3d_image   s    r   c                   @   s   e Zd Zdd Zdd ZdS )TestMorphologyc           	      C   s   t jt jt jt jt jt jf}tjtj	tj
tjf}tttt d}i }tddD ]B}|D ]8}|D ].}|j d| d|j }||||||< qhq`qX|S )N)r   r         _)r   erosiondilationopeningclosingwhite_tophatblack_tophatr   squarediamondZdiskZstarr   r   Zdownscale_local_meanr   Zrgb2grayr   Zcoffeerange__name__)	selffuncsZfootprints_2Dimageoutputnstrelfunckeyr   r   r   _build_expected_output#   s&       z%TestMorphology._build_expected_outputc                 C   s(   t ttd}|  }t|| d S )Nzdata/gray_morph_output.npz)dictr   loadr
   r5   r   )r-   expectedZ
calculatedr   r   r   test_gray_morphology5   s    z#TestMorphology.test_gray_morphologyN)r,   
__module____qualname__r5   r9   r   r   r   r   r      s   
r   c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS ) TestEccentricStructuringElementsc                 C   s\   dt jdt jd | _d| jd< d| j | _tdtddtddtddg| _d S )N   r!   r!   Zdtyper   )r    r       r    )r   onesuint8black_pixelwhite_pixelr   r)   	rectangle)r-   r   r   r   setup_class<   s    


z,TestEccentricStructuringElements.setup_classc                 C   sB   | j D ]6}t| j|}t| j|}t|d| kstqd S Nr=   )	r   r   r#   rC   r$   rD   r   allAssertionError)r-   scdr   r   r   test_dilate_erode_symmetryD   s    
z;TestEccentricStructuringElements.test_dilate_erode_symmetryc                 C   s2   | j D ]&}t| j|}t|| jkstqd S N)r   r   r%   rC   r   rH   rI   )r-   rJ   Z	gray_openr   r   r   test_open_black_pixelJ   s    
z6TestEccentricStructuringElements.test_open_black_pixelc                 C   s2   | j D ]&}t| j|}t|| jkstqd S rN   )r   r   r&   rD   r   rH   rI   )r-   rJ   Z
gray_closer   r   r   test_close_white_pixelO   s    
z7TestEccentricStructuringElements.test_close_white_pixelc                 C   s,   | j D ] }tt| j|dkstqd S Nr   )r   r   rH   r   r%   rD   rI   r-   rJ   r   r   r   test_open_white_pixelT   s    
z6TestEccentricStructuringElements.test_open_white_pixelc                 C   s,   | j D ] }tt| j|dkstqd S rG   )r   r   rH   r   r&   rC   rI   rR   r   r   r   test_close_black_pixelX   s    
z7TestEccentricStructuringElements.test_close_black_pixelc                 C   s2   | j D ]&}t| j|}t|| jkstqd S rN   )r   r   r'   rD   r   rH   rI   r-   rJ   Ztophatr   r   r   test_white_tophat_white_pixel\   s    
z>TestEccentricStructuringElements.test_white_tophat_white_pixelc                 C   s6   | j D ]*}t| j|}t|d| j kstqd S rG   )r   r   r(   rC   r   rH   rI   rU   r   r   r   test_black_tophat_black_pixela   s    
z>TestEccentricStructuringElements.test_black_tophat_black_pixelc                 C   s0   | j D ]$}t| j|}t|dkstqd S rQ   )r   r   r'   rC   r   rH   rI   rU   r   r   r   test_white_tophat_black_pixelf   s    
z>TestEccentricStructuringElements.test_white_tophat_black_pixelc                 C   s0   | j D ]$}t| j|}t|dkstqd S rQ   )r   r   r(   rD   r   rH   rI   rU   r   r   r   test_black_tophat_white_pixelk   s    
z>TestEccentricStructuringElements.test_black_tophat_white_pixelN)r,   r:   r;   rF   rM   rO   rP   rS   rT   rV   rW   rX   rY   r   r   r   r   r<   ;   s   r<   functionc                 C   sX  t jdd}tddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
gtj}| ||}| |}t|| d S )Nr    )radiusr   )r   r*   r   arrayrB   r   )rZ   r2   r/   Zim_expectedZim_testr   r   r   test_default_footprintv   s(    
r]   c                  C   sn   t dt} d| ddddddf< t| }t jdtd}tdd|ddddddf< t|| d S )N   r_   r_   r    r@   r?         )r   zerosboolr   r%   ndigenerate_binary_structurer   )r/   openedimage_expectedr   r   r   "test_3d_fallback_default_footprint   s    
"ri   c                 C   sN   t dt}d|ddddddf< t jdt jd}| ||}t|| d S )Nr^   r    r@   r`   )ra   ra   ra   r?   )r   rc   rd   rA   rB   r   )rZ   r/   cube	new_imager   r   r   test_3d_fallback_cube_footprint   s
    
rl   c               	   C   s   t jdtd} d| dddddf< d| dddddf< d| dddddf< tdg t| }W 5 Q R X tdd}tdg tj| jt j	d|d	}W 5 Q R X t
|| d S )
Nr^   r?   r    r@   r!   ra   rb   operator.*deprecated|\A\Z	footprint)r   rc   rd   r	   r   r'   re   rf   viewrB   r   r/   rk   ro   rh   r   r   r   test_3d_fallback_white_tophat   s     rr   c               	   C   s   t jdtd} d| dddddf< d| dddddf< d| dddddf< tdg t| }W 5 Q R X tdd	}tdg tj| jt j	d|d
}W 5 Q R X t
|| d S )Nr^   r?   r   r@   r!   ra   rb   rm   r    rn   )r   rA   rd   r	   r   r(   re   rf   rp   rB   r   rq   r   r   r   test_3d_fallback_black_tophat   s     rs   c                  C   s   t dt j} d| ddddf< d| ddddf< d| d	< t| }t| }tdd
}tj| |d}tj	| |d}t
|| t
|| d S )N)	   rt      r@   r`      ra   r=   r>   r    rn   )r   rc   rB   r   r%   r&   re   rf   Zgrey_openingZgrey_closingr   )r/   rg   closedro   Zndimage_openedZndimage_closedr   r   r   test_2d_ndimage_equivalence   s    


ry   g?g
ףp=
?g333333?gHzG?gzG?g?g)\(?g{Gz?gQ?gRQ?gHzG?g(\?g=
ףp=?g(\?gQ?g
ףp=
?g{Gz?g(\?g(\?gףp=
?g\(\?g?gq=
ףp?gQ?c                   C   sD   t ttt t ttt t ttt t t	tt
 d S rN   )r   r   r#   imerodedr$   dilatedr%   rg   r&   rx   r   r   r   r   
test_float   s    r}   c                  C   sb   t ttttttg\} }}}}tt	| | tt
| | tt| | tt| | d S rN   )mapr   rz   r{   r|   rg   rx   r   r   r#   r$   r%   r&   )Zim16Zeroded16Z	dilated16Zopened16Zclosed16r   r   r   test_uint16   s    r   c                  C   s  t dddgdddgdddggt j} t dt j}|d d dd d df }t dddddgdddddgdddddgdddddgdddddggt j}t dddddgdddddgdddddgdddddgdddddggt j}tj| |d	 t|| tj| |d	 t|| d S )
Nrb      r@   r_   ra   r    )rb   rb   r   )out)r   r\   rB   rc   r   r$   r   r#   )r/   Zout_array_bigZ	out_arrayZexpected_dilationZexpected_erosionr   r   r   test_discontiguous_out_array  s8    
r   c                  C   s@   t dddddg} t dddddg}t| }t|| d S )Nr    r@   ra   )r   r\   r   r#   r   )r/   r8   r{   r   r   r   test_1d_erosion  s    
r   r#   r$   r&   r%   r'   r(   size)r_   decompositionZ	separablesequencec           	      C   sL   t j|dd}t j||d}tt|}|| |d}|| |d}t|| dS tValidate footprint decomposition for various shapes.

    comparison is made to the case without decomposition.
    Nr   rn   )r   r)   getattrr   r   )	r   rZ   r   r   footprint_ndarrayro   r3   r8   r   r   r   r   test_square_decomposition#  s    
r   nrows)ra      ncolsc           
      C   sP   t j||dd}t j|||d}tt|}|| |d}|| |d}	t||	 dS r   )r   rE   r   r   r   )
r   rZ   r   r   r   r   ro   r3   r8   r   r   r   r   test_rectangle_decomposition6  s    
r   r[   )r@   ra   c           	      C   sL   t j|dd}t j||d}tt|}|| |d}|| |d}t|| dS r   )r   r*   r   r   r   )	r   rZ   r[   r   r   ro   r3   r8   r   r   r   r   test_diamond_decompositionK  s    
r   m)r   r    ra   rb   r1   )r   r    r@   ra   c           
   	   C   s   |dkr8|dkr8t t tj|||d W 5 Q R X nLtj||dd}tj|||d}tt|}|| |d}|| |d}	t||	 dS )r   r   r   Nrn   )pytestZraises
ValueErrorr   Zoctagonr   r   r   )
r   rZ   r   r1   r   r   ro   r3   r8   r   r   r   r   test_octagon_decomposition^  s    
r   )rb   c           	      C   sL   t j|dd}t j||d}tt|}|| |d}|| |d}t|| dS r   )r   rj   r   r   r   )	r   rZ   r   r   r   ro   r3   r8   r   r   r   r   test_cube_decompositionv  s    
r   )ra   c           	      C   sL   t j|dd}t j||d}tt|}|| |d}|| |d}t|| dS r   )r   Z
octahedronr   r   r   )	r   rZ   r[   r   r   ro   r3   r8   r   r   r   r   test_octahedron_decomposition  s    
r   )=Znumpyr   r   Zscipyr   re   Znumpy.testingr   r   r   r   r   r   r   Zskimage._shared._warningsr	   Zskimage._shared.testingr
   Zskimage.morphologyr   r   Zskimage.utilr   r   Zfixturer   r   r   r<   r#   r$   r%   r&   r'   r(   Zgray_functionsmarkZparametrizer]   ri   Zgray_3d_fallback_functionsrl   rr   rs   ry   r\   rz   r{   r|   rg   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   

"6  

	 
 
 
 
 
 
