o
    hnZ                     @   sl  d Z ddlZ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 dZeg d	g d	g d
g dg dg dg dg dg dg dg dg dg dg dg dg dg dg dg d
g d	g d	gZdd ZG dd dejZdd Zdd Zejdejejejejejejejej gdd Z!dd Z"d d! Z#d"d# Z$d$d% Z%d&d' Z&dS )(z1test_watershed.py - tests the watershed function
    N)ndimage)gaussian)label   )	watershedg-q=)   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
      o   g   r   r   r   r
   r	   r   r   r   )r   r   r   r
   r   ^   H   4   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   r   r
   r   r   r
   r   r   r   r   r   r   c                 C   s   t | tjst| } t |tjst|}d| jv r"d|jv r"dS d|| dk< | jtjtjfv s:|jtjtjfv r]t| tj} t|tj}| j|j d 	 | j
|j
 d 	  }nt| } | tj} t|}|tj}| | d 	 }t|S )Nr   g        r   )
isinstancenpndarrayasarrayshapedtype	complex64
complex128realsumimagastypefloat64mathsqrt)abt r%   d/var/www/html/scripts/venv/lib/python3.10/site-packages/skimage/segmentation/tests/test_watershed.pydiff'   s$   

*


r'   c                   @   s   e Zd Zede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d Zdd ZdS )TestWatershed)   r)   c                 C   s  t g dg dg dg dg dg dg dg dg dg dg
t j}t g dg dg dg dg dg dg dg dg dg dg
t j}t||| j}t g dg dg dg dg dg dg dg dg dg dg
}t||}|tk sJ dS )	zwatershed 1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.   N)r   arrayuint8int8r   eightr'   eps)selfdatamarkersoutexpectederrorr%   r%   r&   test_watershed01@   sP   
	





zTestWatershed.test_watershed01c                 C   s  t g dg dg dg dg dg dg dg dg dg dg dgt j}t g dg dg dg dg dg dg dg dg dg dg dgt j}t||}tg dg dg dg dg dg dg dg dg dg dg dg|}| |tk  d	S )
zwatershed 2r*   r+   r,   r-   r/   r0   )r.   r.   r   r   r   r.   r.   r1   Nr   r2   r3   r4   r   r'   
assertTruer6   r7   r8   r9   r:   r<   r%   r%   r&   test_watershed02e   sX   





zTestWatershed.test_watershed02c                 C   s   t g dg dg dg dg dg dg dg dg dg dg
t j}t g dg dg dg dg dg dg dg dg dg dg
t j}t||}tg dg dg dg dg dg dg dg dg dg dg
|}| |tk  d	S )
zwatershed 3r*   r+   r   r   r   r   r   r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r   r.   r0   )r.   r   r   r   r)   r   r.   r.   r   r   r   r)   r)   r.   Nr>   r@   r%   r%   r&   test_watershed03   sR   
	

	

	
zTestWatershed.test_watershed03c                 C      t g dg dg dg dg dg dg dg dg dg dg
t j}t g dg dg dg dg dg dg dg dg dg dg
t j}t||| j}tg dg dg dg dg dg dg dg dg dg dg
|}| |tk  dS )	zwatershed 4r*   r+   rB   rC   rD   r0   rE   N	r   r2   r3   r4   r   r5   r'   r?   r6   r@   r%   r%   r&   test_watershed04   R   
	

	
	
zTestWatershed.test_watershed04c                 C   rG   )	zwatershed 5r*   r+   rB   )r   r   r)   r   r   r   r   rD   r0   )r.   r)   r)   r   r   r   r.   NrH   r@   r%   r%   r&   test_watershed05   rJ   zTestWatershed.test_watershed05c                 C   s   t g dg dg dg dg dg dg dg dg dg	t j}t g dg dg dg dg dg dg dg dg dg	t j}t||| j}tg dg dg dg dg dg dg dg dg dg	|}| |tk  dS )	zwatershed 6r,   r+   r*   r/   r-   r1   r0   NrH   r@   r%   r%   r&   test_watershed06   sL   

			zTestWatershed.test_watershed06c                 C   sr   t }|dk}t|jt}d|d< d|d< t||| j|d}t|dk}t|dk}| t	|| dk dS )	z3A regression test of a competitive case that failedr   r         r      rO   maskrN   N)
blobr   zerosr   intr   r5   r   r?   absr7   r8   rS   r9   r:   size1size2r%   r%   r&   test_watershed07  s   zTestWatershed.test_watershed07c                 C   s   t  }d|dddf< |dk}t|jt}d|d< d|d	< t||| j|d
}t|dk}t|dk}| 	t
|| dk dS )z2The border pixels + an edge are all the same valuer   
   rO   	   r   r   rM   r   rP   rR   rN   N)rT   copyr   rU   r   rV   r   r5   r   r?   rW   rX   r%   r%   r&   test_watershed08$  s   zTestWatershed.test_watershed08c                 C   s   t d}t jdddt}t dt}d}|D ]\}}d|||f< ||||f< |d7 }qt|ddd}t||| j t	
|t j|| j d	S )
zTest on an image of reasonable size

        This is here both for timing (does it take forever?) and to
        ensure that the memory constraints are reasonable
        )  r`   r   r`   )d   r   r      reflect)modeN)r   rU   randomuniformr   rV   r   r   r5   ndiwatershed_iftuint16)r7   imagecoordsr9   idxxyr%   r%   r&   test_watershed095  s   

zTestWatershed.test_watershed09c                 C   s   t g dg dg dg dgt j}t g dg dg dg dgt j}t||| j}tg dg dg dg dg|}| |tk  dS )zwatershed 10)r   r   r   r   )r   r   r   r   )r   r   r   r   )r)   r   r   rb   )r   r   r   r   )r)   r)   rb   rb   NrH   r@   r%   r%   r&   test_watershed10H  s.   

zTestWatershed.test_watershed10c              
      s   t d}t dt}d|d< d|d< d|d< d|d	< t g d
g dg d
g}t|||}t jddddf \ t  fdddD }t |d}| t 	| | f d f |k dS )zFMake sure that all points on this plateau are assigned to closest seed   rr   r      rt   r   rt   r\   r)   r\   rt   rb   r\   r\   )FTF)TTTr   rr   c                    s8   g | ]\}}t  t| d  t| d  qS )r   )r   r!   r   float).0i0j0ijr%   r&   
<listcomp>m  s    ,z2TestWatershed.test_watershed11.<locals>.<listcomp>)rs   ru   rv   rw   N)
r   rU   rV   r2   r   mgriddstackminr?   all)r7   rj   r9   	structurer:   ddminr%   r|   r&   test_watershed11Y  s&   

.zTestWatershed.test_watershed11c                 C   s   t g dg dg dg dg dg dg dg dg d	g d
g dg dg dg dg dg dg}|dk}t|}t||ddd}ttdg dD ]\}}| t ||k|k qNdS )zThe watershed line)   r   r   r
   r
   r
   r
   r
   r
   r
   r
   r
   r
   r
   r
   r
   )r   r   r   r
   r
   r
   f   r   r   r   r   r   r
   r
   r
   r
   )r   r   r   r   r
   r
   r   r   M   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   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   3   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   r   r   r
   )r   r   r   r   r
   r   r   r   r
   r
   r
   r
   r
   r
   r
   r
   r   r   T)connectivitywatershed_linerb   )"   J   r   r   N)r   r2   r   r   zipranger?   r   )r7   r8   	markerbinmarkerwslabarear%   r%   r&   test_watershed12s  s.   
zTestWatershed.test_watershed12c                 C   sr   t j jdd}t jdt jd}g d|g dg df< t |}t||}t j|| t 	||kr7J dS )z.Test to ensure input markers are not modified.rq   )sizer   )r   r   r)   rb   )rt   rt      r   )rt   r   rt   r   N)
r   re   default_rngrU   r3   r^   r   testingassert_equalr   )r7   rj   r9   original_markersresultr%   r%   r&   !test_watershed_input_not_modified  s   

z/TestWatershed.test_watershed_input_not_modifiedN)__name__
__module____qualname__r   onesboolr5   r=   rA   rF   rI   rK   rL   r[   r_   ro   rp   r   r   r   r%   r%   r%   r&   r(   =   s    %&### r(   c                  C   s   t d} d| d d dd f< t jdtd}d|d< d|d< t| |dd	}t jg d
g d
g d
g d
g d
gtd}t j|| t| |}t j| jtd}d|ddd f< t j|| d S )Nrt   rN   r   r)   r   )r   r   r   )r   r)   {Gz?compactness)r   r   r   r   r   r   )	r   rU   rV   r   r2   r   r   r   r   )rj   seedscompactr;   normalr%   r%   r&   test_compact_watershed  s&   


r   c                  C   sl   t d} d| ddddf< t| ddd}t jg dg dg dg dg dgt jd	}t j|| dS )
z>Test that passing just the number of seeds to watershed works.r   r   Nr)   r   r   r   )r   r   r   r   r   r   r   )r   rU   r   r2   int32r   r   )rj   r   r;   r%   r%   r&   test_numeric_seed_watershed  s   

r   r   c                 C   s4   t d}t d| }t||}|j|jksJ d S )N)ra   ra   )r   rU   r   r   )r   rj   r9   r:   r%   r%   r&   test_watershed_output_dtype  s   

r   c                  C   sN   t d} t d}tt t| | W d    d S 1 s w   Y  d S )Nr   rt   rO   r   r   pytestraises
ValueErrorr   )rj   r9   r%   r%   r&   test_incorrect_markers_shape  s
   

"r   c                  C   sR   t d} t d}tt t| d|d W d    d S 1 s"w   Y  d S )Nr   r   rb   )r9   rS   r   )rj   rS   r%   r%   r&   test_incorrect_mask_shape  s
   

"r   c                  C   s8   t } | dk}t| dd|d}t||  dksJ d S )Nr      r   )r   rS   r   )rT   r   r   r   r8   rS   r:   r%   r%   r&   test_markers_in_mask  s   r   c                  C   s.   t } | dk}t| |d}t|dksJ d S )Nr   rR   r   )rT   r   r   maxr   r%   r%   r&   test_no_markers  s   r   c                  C   s  t d\} }d\}}}}}}}}	d\}
}}}| | d || d  |
d k }| | d || d  |d k }| | d || d  |d k }| | d ||	 d  |d k }t ||}t ||}t ||}t|}t j|d ddd }t |dkdd}td	| |dd
d}td	| |dd
d}t |j	d dksJ t |j	d dksJ t
tdg dD ]\}}t ||k|ksJ qt
tdg dD ]\}}t ||k|ksJ qdS )z
    Watershed segmentation should output different result for
    different connectivity
    when markers are calculated where None is supplied.
    Issue = 5084
    )i  i  )      i,  x   ra   ra   iT  r   )ra   2   (   P   r      r   )decimalsr   r   r   )rS   r   r   rN   rt   )  E  iO  iY+  i  i,  )r   r   iO  ib0  i,  N)r   indices
logical_orrg   distance_transform_edtaroundwherer   uniquer   r   r   r   )rm   rn   x1y1x2y2x3y3x4y4r1r2r3r4mask_circle1mask_circle2mask_circle3mask_circle4rj   DummyBTDummyBT_disImg_mask	labels_c1	labels_c2r   r   r%   r%   r&   test_connectivity  s4       
r   )'__doc__r    unittestnumpyr   r   scipyr   rg   skimage._shared.filtersr   skimage.measurer   
_watershedr   r6   r2   rT   r'   TestCaser(   r   r   markparametrizer3   r4   ri   int16uint32r   uint64int64r   r   r   r   r   r   r%   r%   r%   r&   <module>   sb    
  [
