o
    :ήc#                     @   s   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
 d dlmZ d dlmZ d dlmZmZmZ d d	lmZmZmZ G d
d dZG dd dZG dd dZdS )    N)assert_array_equal)	correlate)draw)expected_warnings)fetch)imread)medial_axisskeletonizethin)_generate_thin_lutsG123_LUT	G123P_LUTc                   @   sd   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d ZdS )TestSkeletonizec                 C   s&   t d}t|}t|t d d S )N   r   )npzerosr	   r   selfimresult r   P/tmp/pip-target-vg8gfxp4/lib/python/skimage/morphology/tests/test_skeletonize.pytest_skeletonize_no_foreground   s   
z.TestSkeletonize.test_skeletonize_no_foregroundc                 C   sB   t d}tt t| W d    d S 1 sw   Y  d S )Nr   r   r   pytestraises
ValueErrorr	   r   r   r   r   r   test_skeletonize_wrong_dim1   s   

"z+TestSkeletonize.test_skeletonize_wrong_dim1c                 C   sF   t d}tt t|dd W d    d S 1 sw   Y  d S )N)r   r   r   zhang)methodr   r   r   r   r   test_skeletonize_wrong_dim2   s   
"z+TestSkeletonize.test_skeletonize_wrong_dim2c                 C   sR   t d}d|d< d|d< tt t| W d    d S 1 s"w   Y  d S )Nr      r   r      )r   r#   r   r   r   r   r   test_skeletonize_not_binary   s   

"z+TestSkeletonize.test_skeletonize_not_binaryc                 C   sJ   t d}d|d< tt t| W d    d S 1 sw   Y  d S )Nr   r%   r$   r   r   r   r   r   !test_skeletonize_unexpected_value&   s
   

"z1TestSkeletonize.test_skeletonize_unexpected_valuec                 C   s   t d}t| d S )N      )r   onesr	   r   r   r   r   test_skeletonize_all_foreground,   s   
z/TestSkeletonize.test_skeletonize_all_foregroundc                 C   s,   t dt j}d|d< t|}t|| d S )Nr   r#   r)   r)   r   r   uint8r	   r   r   r   r   r   test_skeletonize_single_point0   s   z-TestSkeletonize.test_skeletonize_single_pointc                 C   sD   t dt j}d|dddf< d|d< d|d< t|}t|| d S )Nr   r#   r)   )r%   r1   )r*   r   r.   r   r   r   r    test_skeletonize_already_thinned6   s   z0TestSkeletonize.test_skeletonize_already_thinnedc                 C   s<   t tddd}|dk}t|}ttd}t|| d S )Nzdata/bw_text.pngT)as_grayr   zdata/bw_text_skeleton.npy)r   r   r	   r   loadr   r   r   r   expectedr   r   r   test_skeletonize_output>   s
   z'TestSkeletonize.test_skeletonize_outputc                 C   sH  t d}d|ddddf< d|ddddf< d|ddddf< tdddd	\}}tdD ]
}d||| |f< q1tdddd	\}}td
D ]
}d||| |f< qJt |j\}}|d d |d d  dk }|d d |d d  dk }d||< d||< t|}	t ddgddggt j	}
t
|	|
dd}t |dkrJ d S )N),  r8   r#   
   id   i      i        r%   i  i  r   constant)moder*   )r   r   r   linerangeindicesshaper	   arrayr/   r   any)r   imagerscsiiriccircle1circle2r   maskblocksr   r   r   test_skeletonize_num_neighboursH   s.   

z/TestSkeletonize.test_skeletonize_num_neighboursc                 C   s   t dt j}d|d< d|d< d|d< d|d< d|d< d|d< d|d	< t|}t jg d
g dg dg dg dg d
gt jd}t ||ksJJ d S )N)   rR   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#   dtype)r   r   r/   r	   rE   allr5   r   r   r   test_lut_fixg   s&   
zTestSkeletonize.test_lut_fixN)__name__
__module____qualname__r   r   r"   r&   r'   r,   r0   r2   r7   rQ   rV   r   r   r   r   r      s    
r   c                   @   sH   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )TestThinc              	   C   s>   t jg dg dg dg dg dg dg dgt jd}|S )zimage to test thinning withr   r   r   r   r   r   r   )r   r#   r#   r#   r#   r#   r   )r   r#   r   r#   r#   r#   r   rS   )r   rE   r/   r   iir   r   r   input_image{   s   
zTestThin.input_imagec                 C   s    t tt ddksJ d S )Nr9   r9   F)r   rU   r
   r   )r   r   r   r   
test_zeros   s    zTestThin.test_zerosc              	   C   s\   t | jdtj}tjg dg dg dg dg dg dg dgtjd}t|| d S )Nr#   r[   r   r   r#   r   r   r   r   )r   r#   r   r#   r#   r   r   )r   r   r#   r#   r#   r   r   rS   r
   r^   astyper   r/   rE   r   r   r   r6   r   r   r   test_iter_1   s   
zTestThin.test_iter_1c                 C   sd   t | jddtj}tdg t | jddtj}W d    n1 s&w   Y  t|| d S )Nr#   )max_num_iterz(`max_iter` is a deprecated argument name)max_iter)r
   r^   rc   r   r/   r   r   )r   result1result2r   r   r   test_max_iter_kwarg_deprecation   s
   z(TestThin.test_max_iter_kwarg_deprecationc              	   C   sZ   t | jtj}tjg dg dg dg dg dg dg dgtjd}t|| d S )Nr[   ra   )r   r#   r   r#   r   r   r   rS   rb   rd   r   r   r   test_noiter   s   
zTestThin.test_noiterc              	   C   sP   t dt dfD ]}tt t| W d    n1 s w   Y  q
d S )Nr)   )r)   r)   r)   )r   r   r   r   r   r
   r\   r   r   r   test_baddim   s   
zTestThin.test_baddimc                 C   s"   t  \}}t|t t|t d S )N)r   r   r   r   )r   g123g123pr   r   r   test_lut_generation   s   

zTestThin.test_lut_generationN)rW   rX   rY   propertyr^   r`   re   rj   rk   rl   ro   r   r   r   r   rZ   z   s    
rZ   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S )TestMedialAxisc                 C   s&   t tdt}t|dksJ dS )z)Test skeletonize on an array of all zerosr_   FNr   r   r   boolrU   r   r   r   r   r   test_00_00_zeros   s   zTestMedialAxis.test_00_00_zerosc                 C   s0   t tdttdt}t|dksJ dS )z6Test skeletonize on an array that is completely maskedr_   FNrr   rt   r   r   r   test_00_01_zeros_masked   s   
z&TestMedialAxis.test_00_01_zeros_maskedc                 C   sn   t d}d|dddf< d|dddf< d|dddf< t |jd}d|dddf< t|}t|| dS )	z'Test a thick vertical line, issue #3861)	   rw   r#   Nr%   r)   r*   FT)r   r   fullrD   r   r   )r   imgr6   r   r   r   r   test_vertical_line   s   
z!TestMedialAxis.test_vertical_linec                 C   s   t dt}d|ddddf< t jg dg dg dg dg d	g dg dg dg dg	td
}t|}t ||ks?J t|dd\}}| dksOJ dS )zTest skeletonize on a rectanglerw      Tr#   r1   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   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   rS   )return_distancer*   N)r   r   rs   rE   r   rU   max)r   rG   r6   r   distancer   r   r   test_01_01_rectangle   s$   
	
z#TestMedialAxis.test_01_01_rectanglec                 C   s   t dt}d|ddddf< d|dddf< t jg dg d	g d
g dg dg dg d
g d	g dg	td}t|}t ||ksGJ dS )z9Test skeletonize on a rectangle with a hole in the middler{   Tr#   r1   Fr*   r}   r~   )r   r   r#   r#   r#   r#   r#   r#   r#   r#   r#   r#   r#   r   r   r   rS   N)r   r   rs   rE   r   rU   )r   rG   r6   r   r   r   r   test_01_02_hole   s"   
	
zTestMedialAxis.test_01_02_holec                 C   s>   t dt}d|ddddf< t|}t ||ksJ dS )z(Test skeletonize on a 1-pixel thin strip)r#   r   TNr#   r1   )r   r   rs   r   rU   )r   rG   r   r   r   r   test_narrow_image   s   z TestMedialAxis.test_narrow_imageN)	rW   rX   rY   ru   rv   rz   r   r   r   r   r   r   r   rq      s    rq   )numpyr   r   numpy.testingr   scipy.ndimager   skimager   skimage._shared._warningsr   skimage._shared.testingr   
skimage.ior   skimage.morphologyr   r	   r
   skimage.morphology._skeletonizer   r   r   r   rZ   rq   r   r   r   r   <module>   s    k8