o
    ç^iP‚  ã                   @   s   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	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dd„ Zdd„ 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/d0„ Z-dS )1z0test_watershed.py - tests the watershed functioné    N)Úndimage)Úgaussian)Úpeak_local_max)Ú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/RAG/RAG_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   ©r0   r0   r0   r0   r0   r0   r0   ©r0   r   r   r   r   r   r0   N)r   ÚarrayÚuint8Úint8r   Úeightr(   Úeps)ÚselfÚdataÚmarkersÚoutÚexpectedÚerrorr&   r&   r'   Útest_watershed01F   sX   öóöóöÿ
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/   r1   r2   )r0   r0   r   r   r   r0   r0   r3   N©r   r4   r5   r6   r   r(   Ú
assertTruer8   ©r9   r:   r;   r<   r>   r&   r&   r'   Útest_watershed02x   s^   õòõò
õò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   r0   r2   )r0   r   r   r   r+   r   r0   ©r0   r   r   r   r+   r+   r0   Nr@   rB   r&   r&   r'   Útest_watershed03­   sX   öóöó
öó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-   rD   rE   rF   r2   rG   N©	r   r4   r5   r6   r   r7   r(   rA   r8   rB   r&   r&   r'   Útest_watershed04ß   óX   öóöóöózTestWatershed.test_watershed04c                 C   rI   )	zwatershed 5r,   r-   rD   )r   r   r+   r   r   r   r   rF   r2   )r0   r+   r+   r   r   r   r0   NrJ   rB   r&   r&   r'   Útest_watershed05  rL   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,   r1   r/   r3   r2   NrJ   rB   r&   r&   r'   Útest_watershed06C  sR   ÷ô÷ô÷ô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   ©é   rQ   ©ÚmaskrP   N)
Úblobr   Úzerosr   Úintr   r7   r   rA   Úabs©r9   r:   rU   r;   r<   Úsize1Úsize2r&   r&   r'   Útest_watershed07r  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   é
   rQ   é	   r   r   rO   r   rR   rT   rP   N)rV   Úcopyr   rW   r   rX   r   r7   r   rA   rY   rZ   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 )
z«Test 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
        )éè  rb   r   rb   )éd   r   r   é   Úreflect)ÚsigmaÚmodeN)r   rW   ÚrandomÚuniformr   rX   r   r   r7   ÚndiÚwatershed_iftÚuint16)r9   ÚimageÚcoordsr;   ÚidxÚxÚyr&   r&   r'   Útest_watershed09“  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   rd   )r   r   r   r   )r+   r+   rd   rd   NrJ   rB   r&   r&   r'   Útest_watershed10¦  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©é   ru   r   ©é   rw   r   ©rw   r^   r+   ©r^   rw   rd   ©r^   r^   )FTF)TTTr   ru   c                    s8   g | ]\}}t  ˆ  t¡| d  ˆ t¡| d  ¡‘qS )r   )r   r"   r   Úfloat)Ú.0Úi0Új0©ÚiÚjr&   r'   Ú
<listcomp>Æ  s    &ÿÿz2TestWatershed.test_watershed11.<locals>.<listcomp>)rv   rx   ry   rz   N)
r   rW   rX   r4   r   ÚmgridÚdstackÚminrA   Úall)r9   rm   r;   Ú	structurer<   ÚdÚdminr&   r   r'   Útest_watershed11²  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_linerd   )é"   éJ   r’   r’   N)r   r4   r   r   ÚzipÚrangerA   r   )r9   r:   Ú	markerbinÚmarkerÚwsÚlabÚarear&   r&   r'   Útest_watershed12Î  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.rt   )Úsize©r   )r   r   r+   rd   )rw   rw   é   r   )rw   r   rw   r   N)
r   rh   Údefault_rngrW   r5   r`   r   ÚtestingÚassert_equalr†   )r9   rm   r;   Úoriginal_markersÚresultr&   r&   r'   Ú!test_watershed_input_not_modifiedú  s   

z/TestWatershed.test_watershed_input_not_modifiedN)Ú__name__Ú
__module__Ú__qualname__r   ÚonesÚboolr7   r?   rC   rH   rK   rM   rN   r]   ra   rr   rs   rŠ   rš   r£   r&   r&   r&   r'   r)   C   s"    25222/  .r)   c                  C   s  t  d¡} d| d d …df< 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g d¢g d¢g d¢g d¢g d¢gtd}t j ||¡ t| |d	dd}||k}d||dk< t  |¡r…J ‚d S )N©rw   rP   r   r+   r   rd   rœ   )r   r   )r   rw   ç{®Gáz„?©Úcompactness)r   r   r   r   r   r   ©r   r   r   r   r   r   T)r¬   r   Fr   )r   rW   rX   r   r4   rŸ   r    Úany)rm   ÚseedsÚcompactr=   ÚnormalÚcompact_wslÚ
differencer&   r&   r'   Útest_compact_watershed  s@   
ûø

ûø
r´   c                  C   sX  t  d¡\} }d\}}}}d\}}| | d || d  |d k }| | d || d  |d k }	t  ||	¡}
t |
¡}t|t  d¡|
d}|dd…df  d	7  < t j|jt	d
}d|t
|jƒ< t |¡\}}t| ||
d}tjj|| d}|d jdks‚J ‚t jddtd dd¡}t j |d j|¡ |d jdks¡J ‚|d jdksªJ ‚dS )aË  
    Check edge case behavior reported in gh-6632

    While we initially viewed the behavior described in gh-6632 [1]_ as a bug,
    we have reverted that decision in gh-7661. See [2]_ for an explanation.
    So this test now actually asserts the behavior reported in gh-6632 as
    correct.

    .. [1] https://github.com/scikit-image/scikit-image/issues/6632.
    .. [2] https://github.com/scikit-image/scikit-image/issues/7661#issuecomment-2645810807
    )éP   rµ   )é   r¶   é,   r   )é   é   r   r*   )Ú	footprintÚlabelsNr   rP   rœ   TrT   )Úintensity_imager   iöÿÿÿ)ÚstartÚstopr   r0   r^   iˆ  )r   ÚindicesÚ
logical_orrj   Údistance_transform_edtr   r§   rW   r   r¨   ÚtupleÚTr   r   ÚskimageÚmeasureÚregionpropsÚextentÚaranger{   ÚreshaperŸ   r    Úimage_intensityÚ
num_pixels)rp   rq   Úx1Úy1Úx2Úy2Úr1Úr2Úmask_circle1Úmask_circle2rm   Údistancern   rU   r;   Ú_r»   ÚpropsÚexpected_regionr&   r&   r'   Ú"test_watershed_with_markers_offset3  s&     
rØ   c                  C   s¬   t  g d¢g d¢g¡} t  g d¢g d¢g¡}t  g d¢g d¢g¡}t| |d}t j ||¡ t  g d¢¡ } t  g d¢¡}t  g d	¢¡}t| || d
kd}t j ||¡ dS )aì  
    Test edge case behavior when markers spill over into another basin / compete.

    While we initially viewed the behavior described in gh-6632 [1]_ as a bug,
    we have reverted that decision in gh-7661. See [2]_ for an explanation.
    So this test now actually asserts the behavior reported in gh-6632 as
    correct.

    .. [1] https://github.com/scikit-image/scikit-image/issues/6632.
    .. [2] https://github.com/scikit-image/scikit-image/issues/7661#issuecomment-2645810807
    )	rP   rw   rd   r+   r   r+   r   r   r   )	r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   ©r;   )r   r   r   r   r   r   r+   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   ©r;   rU   N)r   r4   r   rŸ   r    Úassert_array_equal©rm   r;   r=   r¢   r&   r&   r'   Ú%test_watershed_simple_basin_overspill`  s    
ÿ
ÿ
ÿrÝ   c                  C   s~   t  g d¢¡} t  g d¢¡}t  g d¢¡}t| |d}t j ||¡ t  g d¢¡} t  g d¢¡}t| |d}t j ||¡ dS )a  
    Edge case: Basins should be distributed evenly between contesting markers.

    Markers should be prevented from spilling over into another basin and
    conquering it against other markers with the same claim, just because they
    get to the basin one step earlier.
    )
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   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   r4   r   rŸ   r    rÜ   r&   r&   r'   Ú+test_watershed_evenly_distributed_overspill€  s   	rß   c                  C   s`   t  g d¢g d¢g¡} t  g d¢g d¢g¡}t  g d¢g d¢g¡}t| |d}t j ||¡ dS )	z°Check that markers placed at maxima don't conquer other pixels.

    Regression test for gh-7661 [1]_.

    .. [1] https://github.com/scikit-image/scikit-image/issues/7661
    )r   r   r   r+   rd   rw   rd   )r   r   r   r+   rd   rd   rd   )r   r   r   r   r   r   r   r,   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   rÙ   NrÞ   rÜ   r&   r&   r'   Útest_markers_on_maxima–  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   rW   r   r4   Úint32rŸ   r    )rm   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)rc   rc   )r   rW   r   r   )r   rm   r;   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©   ©rw   rQ   ©r   r§   ÚpytestÚraisesÚ
ValueErrorr   )rm   r;   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ä   rd   rÚ   rå   )rm   rU   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   rU   r   )rV   r   r   r†   ©r:   rU   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   rT   r   )rV   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s¢J ‚t  |¡j	d dks®J ‚t
tdƒg d¢ƒD ]\}}t  ||k¡|ksÆJ ‚q·t
tdƒg d¢ƒD ]\}}t  ||k¡|ksßJ ‚qÐd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   rc   rc   iT  rñ   )rc   é2   é(   rµ   r   é   r   )Údecimalsr   rð   rª   )rU   r   r¬   rP   rw   )é€ñ  éE  ióO  iY+  i  i,  )r÷   rø   iòO  ib0  i,  N)r   r¿   rÀ   rj   rÁ   ÚaroundÚwherer   Úuniquer   r“   r”   r   )rp   rq   rÌ   rÍ   rÎ   rÏ   Úx3Úy3Úx4Úy4rÐ   rÑ   Úr3Úr4rÒ   rÓ   Úmask_circle3Úmask_circle4rm   ÚDummyBTÚDummyBT_disÚImg_maskÚ	labels_c1Ú	labels_c2r˜   r™   r&   r&   r'   Útest_connectivityá  s4       
ÿÿÿr	  ).Ú__doc__r!   ÚunittestÚnumpyr   ræ   Úscipyr   rj   Úskimage.measurerÄ   Úskimage._shared.filtersr   Úskimage.featurer   r   Ú
_watershedr   r8   r4   rV   r(   ÚTestCaser)   r´   rØ   rÝ   rß   rà   râ   ÚmarkÚparametrizer5   r6   rl   Úint16Úuint32rá   Úuint64Úint64rã   ré   rê   rí   rï   r	  r&   r&   r&   r'   Ú<module>   sr    
ì     G.- "þ
