o
    hX                  	   @   s   d dl Z d dlZd dl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 ejd G dd dZejd	gd
d e ededD dd Zdd Zdd ZG dd dZdS )    N)assert_array_almost_equalassert_array_equalassert_equal)ndimage)expected_warnings)peak   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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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9S ):TestPeakLocalMaxc                 C   s<   t d}tj|dd}t|t ju sJ |jdksJ d S )N)   r
      min_distancer   )npzerosr   peak_local_maxtypendarraysize)selftrivialpeak_indices r   Z/var/www/html/scripts/venv/lib/python3.10/site-packages/skimage/feature/tests/test_peak.pytest_trivial_case   s   
z"TestPeakLocalMax.test_trivial_casec                 C   st   g d}dt jdd }|D ]
\}}d|||f< qtj|dd}t|t|ks+J |D ]
}t||v s7J q-d S )N)   r   )r      )r   r   )r   r   g?   r      r   )r   randomrandr   r   lentuple)r   peak_locationsimagercpeaks_detectedlocr   r   r   test_noisy_peaks   s   z!TestPeakLocalMax.test_noisy_peaksc                 C   sP   t jdt jd}d|d< d|d< tj|ddd	}t|dks J t|dg d S )
Nr   r   dtype
   r   r   r      r0   r         ?r   threshold_relr   r   uint8r   r   r!   r   r   r$   peaksr   r   r   test_relative_threshold%      z(TestPeakLocalMax.test_relative_thresholdc                 C   sP   t jdt jd}d|d< d|d< tj|ddd}t|dks J t|dg d S )	Nr*   r+   r-   r.   r   r/   r   r   threshold_absr4   r6   r   r   r   test_absolute_threshold-   r9   z(TestPeakLocalMax.test_absolute_thresholdc                 C   s4   t jddt jd}tj|dd}t|dksJ d S )N)r   r      r+   r   r   r   )r   fullr5   r   r   r!   r6   r   r   r   test_constant_image5   s   z$TestPeakLocalMax.test_constant_imagec                 C   sF   t jdt jd}d|ddddf< tj|dd}t|dks!J d S )Nr*   r+   r-   r   r0   r      r   r   r5   r   r   r!   r6   r   r   r   test_flat_peak:   s   zTestPeakLocalMax.test_flat_peakc                 C   s   t jdt jd}d|d< d|d< tj|dd}| ddgd	d	ggks%J t d
}d|d< tj|dd}| ddgddgdd	gddggksIJ d S )Nr*   r+   r   r.   r-   r/   r   r   r0   )r0   r-   )r      r0   r@   )r   )r   r0   r   r   r   r   )r   r   r5   r   r   tolistr6   r   r   r   test_sorted_peaks@   s   
,z"TestPeakLocalMax.test_sorted_peaksc                 C   s   t jdt jd}d|d< d|d< d|d< d	|d
< d|d< ttj|ddddks*J tj|dddd}t|dks;J d|v sAJ d|v sGJ tj|dddd}t|dksXJ d|v s^J d|v sdJ d|v sjJ d
|v spJ d S )Nr   r+   r-   r.      r   r0      r   r      r0   r   r   r   r0   r   r   r:   r   rC   )r   r;   	num_peaksr@   )r   r   r5   r!   r   r   r   r$   peaks_limitedr   r   r   test_num_peaksL   s2   
zTestPeakLocalMax.test_num_peaksc                 C   s   t jdt jd}t jdt jdd }d|d< d|d< d|d	< d
|d< d|d< tj|dd|d}t|dks7J tj|dd|dd}t|dksIJ d S )Nr   r+   r   r-   r.   rF   rG   rH   rI   rJ   rK   r   rL   r   r   )r   r;   labelsr   rC   )r   r;   rQ   rM   rA   )r   r$   rQ   rO   r   r   r   test_num_peaks_and_labelsb   s   
z*TestPeakLocalMax.test_num_peaks_and_labelsc                 C   s   t jd t jjdd}t jddddf \}}d|dk |d	kd
  }tj||ddt jd
d}t|dks:J tj||ddt jdd}t|dksNJ tj||ddd
d
d}t|d
ksaJ d S )Nr   r      r   r   r   rT   r   r-      rC   )rQ   r   r3   rM   num_peaks_per_labelrJ   r@   )	r   r   seeduniformmgridr   r   infr!   )r   r$   ijrQ   resultr   r   r   'test_num_peaks_tot_vs_labels_4quadrantsq   s,   z8TestPeakLocalMax.test_num_peaks_tot_vs_labels_4quadrantsc                 C   sH   t d}t d|ddd d df< tj|ddd}t|dks"J d S )N)r-   r-   d   r   r   r   rC   )r   rM   )r   r   aranger   r   r!   rN   r   r   r   test_num_peaks3D   s   
z!TestPeakLocalMax.test_num_peaks3Dc                 C   s   t jjdd}t jddddf \}}d|dk |dkd	  }d
||dk< t jddddf \}}|| ||  dk}t |jt}dD ]"\}}dD ]\}	}
tj||||	|
f |d||||	|
f< qLqF||k}t	j
||dd|dd}t j|td}d|t|j< ||k sJ d S )N(   <   rU   r   rd   re   r   r   rT   rC   r   r@   	   )r   r   )r   rd   )r   rT   )rT   re   	footprintFrQ   r   r3   rk   exclude_borderr+   Tr   r   rY   rZ   r   shapefloatndimaximum_filterr   r   
zeros_likeboolr"   Tallr   r$   r\   r]   rQ   rk   expectediminimaxjminjmaxpeak_idxr^   r   r   r   test_reorder_labels   s*   
z$TestPeakLocalMax.test_reorder_labelsc                 C   sL  t jjdd}t jddddf \}}d|dk |dkd	  }t jd
dd
df \}}|| ||  dk}t |jt}dD ]"\}}dD ]\}	}
tj||||	|
f |d||||	|
f< qFq@t j	t 
||kdd}|t |t|j d d d  }tj||dd|dd}|t |t|j d d d  }||k sJ d S )Nrc   rU   r   rd   re   r   r   rT   rC   rf   r@   rg   rh   ri   rj   axisFrl   )r   r   rY   rZ   r   ro   rp   rq   rr   stacknonzeroargsortr"   ru   r   r   rv   )r   r$   r\   r]   rQ   rk   rx   ry   rz   r{   r|   r^   r   r   r   test_indices_with_labels   s(   "
"z)TestPeakLocalMax.test_indices_with_labelsc                 C   s  t d}d|g dg dg df< d|d< d|d< t jg dgtd}t jg dg dg dgtd}tj|d	d	d
}t|| ttj|d	d	d
tj|d	dd
 ttj|d	dd
tj|d	dd
 tj|d	dd
}t|| tj|dd}t j|td}d|t	|j
< t||t d S )Nr   r   r   r   )r   r   r   )r   r   r   )r   r   r   )r0   r   r   )rC   rC   rC   r+   rC   r   rm   Tr   Frm   )r   r   arrayintr   r   r   rs   rt   r"   ru   astype)r   nd_imagerx   expectedNoBorderr^   r}   r   r   r   test_ndarray_exclude_border   s8   


z,TestPeakLocalMax.test_ndarray_exclude_borderc                 C   sL   t d}t dt}tj||t dtdddd}|jd|jfks$J d S )Nr-   r   r/   r   r   FrQ   rk   r   r3   rm   )	r   r   r   r   r   onesrt   ro   ndim)r   r$   rQ   r^   r   r   r   
test_empty   s   

zTestPeakLocalMax.test_emptyc                 C   s>   t d}tj|t dtdddd}|jd|jfksJ d S )N)r-   r-   r-   )r0   r0   r0   r   r   F)rk   r   r3   rm   )r   r   r   r   r   rt   ro   r   )r   r$   r^   r   r   r   test_empty_non2d_indices   s   

z)TestPeakLocalMax.test_empty_non2d_indicesc                 C   sz   t d}t dt}d|d< d|d< tj||t dtdddd}t j|td}d	|t|j	< t 
||dkks;J d S )
Nr   r   r*   r/   r   Fr   r+   T)r   r   r   r   r   r   rt   rs   r"   ru   rv   )r   r$   rQ   r}   r^   r   r   r   test_one_point   s   

zTestPeakLocalMax.test_one_pointc                 C   sz   t d}t dt}d|dddf< d|dddf< t jt |dkdd}tj||t dtddd	d
}t	|| d S )Nr   r   r      r   r   r/   r   Fr   
r   r   r   r   wherer   r   r   rt   r   r   r$   rQ   rx   r^   r   r   r   test_adjacent_and_same   s   

z'TestPeakLocalMax.test_adjacent_and_samec                 C   s   t d}t dt}d|d< d|d< d|dddf< t jt |dkdd	}tj||t d
tdddd}t	|| tj||dddd}t	|| d S )Nr   r   r*   r1   r   r   r   r   r   r   r/   r   Fr   )rQ   r   r3   rm   r   r   r   r   r   test_adjacent_and_different   s"   


z,TestPeakLocalMax.test_adjacent_and_differentc                 C   sv   t d}t dt}d|d< d|d< d||dk< t jt |dkdd}tj||t d	tddd
d}t	|| d S )Nr   r   r*   r1   )r   rJ   r   r   r   r/   Fr   r   r   r   r   r   test_not_adjacent_and_different  s   

z0TestPeakLocalMax.test_not_adjacent_and_differentc                 C   z   t d}t dt}d|d< d|d< d|d< d|d< t jt |dkdd	}tj||t d
tdddd}t	|| d S )Nr   r   r*   r1   )r   rV   rC   r   r   r   r/   Fr   r   r   r   r   r   test_two_objects     

z!TestPeakLocalMax.test_two_objectsc                 C   r   )Nr   r   r*   r1   r   rC   r   r   r   r/   Fr   r   r   r   r   r   test_adjacent_different_objects)  r   z0TestPeakLocalMax.test_adjacent_different_objectsc                 C   s  t jjdd}t jddddf \}}d|dk |dkd	  }t jd
dd
df \}}|| ||  dk}t |jt}dD ]"\}}dD ]\}	}
tj||||	|
f |d||||	|
f< qFq@||k}t	j
|||dddd}t j|td}d|t|j< t ||ksJ d S )NrS   rU   r   r   rT   r   r-   rV   rC   rf   r@   rg   ))r   r-   r   ))r   rV   )rV   rT   rj   Fr   r+   Trn   rw   r   r   r   test_four_quadrants7  s,   z$TestPeakLocalMax.test_four_quadrantsc              	   C   s   t jjdd}t dgg}tj|t dt|ddddd}t j|t	d}d	|t
|j< t |s3J tj||ddd
}t j|t	d}d	|t
|j< t |sQJ dS )zzregression test of img-1194, footprint = [1]
        Test peak.peak_local_max when every point is a local maximum
        r   rU   r   r   r   F)rQ   rk   r   r3   r;   rm   r+   T)rk   r;   rm   N)r   r   rY   r   r   r   r   r   rs   rt   r"   ru   rv   )r   r$   rk   r}   r^   r   r   r   	test_diskL  s$   zTestPeakLocalMax.test_diskc                 C      t d}d|d< d|d< ttj|dddg dg ttj|dddg dg ttj|ddd	d
 g dg dgks@J ttj|ddd g dg dgksVJ d S )N)rT   rT   rT   r   )rV   rV   rV   r   r-   r   r2   r   Fr   r3   rm   r   r   r   r   r   r   sortedrD   r   r$   r   r   r   test_3Da  4   


zTestPeakLocalMax.test_3Dc                 C   r   )N)rT   rT   rT   rT   r   )rV   rV   rV   rV   )r   r   r   r   r-   r   r2   r   Fr   r   r   r   r   r   r   test_4Ds  r   zTestPeakLocalMax.test_4Dc                 C   s   t d}d|d< tt|dksJ d|d< tt|ddgg d|d< tdg ttj|dd|jd ks=J W d    d S 1 sHw   Y  d S )Nr*   r   )rC   rC   r   rC   zWhen min_distance < 1r   )r   r   r!   r   r   r   r   r   r   r   r   r   test_threshold_rel_default  s   

"z+TestPeakLocalMax.test_threshold_rel_defaultc                 C   s|   t dd}d|d< d|d< tj|dd}|jdksJ tj|ddd	}t|d
ks,J d
dg|v s4J ddg|v s<J d S )N)r-   r-   r   )rC   r@   )r0   r   r0   r   r   r   rC   r@   )r   r>   r   r   r   r!   r6   r   r   r   test_peak_at_border  s   z$TestPeakLocalMax.test_peak_at_borderN)__name__
__module____qualname__r   r)   r8   r<   r?   rB   rE   rP   rR   r_   rb   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	      s:    	r	   indicesc                 C   s   g | ]}|gqS r   r   ).0r   r   r   r   
<listcomp>  s    r   r   c                 C   s   t d}d|| < ttj|dddksJ ttj|dddks#J | d dv s/| d dv r2d}nd}ttj|ddd|ksBJ | d dv rKd}nd}ttj|d	d|ksZJ | d dv rcd}nd}ttj|d
d|ksrJ d S )Nr*   r   Fr   r   )r   r@   Tr   )r   r   )r   r   )r   r   r!   r   r   )r   r$   expected_peaksr   r   r   test_exclude_border  s8   
r   c                  C   s<  t d} tt tj| ddsJ W d    n1 sw   Y  tt tj| dds2J W d    n1 s<w   Y  tt tj| ddsPJ W d    n1 sZw   Y  tt tj| ddsnJ W d    n1 sxw   Y  tt tj| ddsJ W d    d S 1 sw   Y  d S )Nr*   )r   r   g      ?)r   a)r   r   r   )r   r   pytestraises
ValueErrorr   r   	TypeError)r$   r   r   r   test_exclude_border_errors  s    
"r   c                  C   sf   t jdd} t dt}d|ddddf< d|ddddf< |  }tj| |d	}t| | d S )
Nr=   )r=   r=   r   r-   r   r   rH      )rQ   )	r   r   r    r   r   copyr   r   r   )imgrQ   
img_before_r   r   r   test_input_values_with_labels  s   r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestProminentPeaksc                 C   s   t d}d\}}}d\}}}d\}}	}
||||f< ||||f< |
||	|f< t|}t|d dks5J t|d |d |d D ] \}}}||||
fv sOJ ||||fv sXJ ||||	fv saJ qAd S )	NrV   rV   )rH   rJ   r   )rC   rC   r   )r   r   r   r   r0   r   rC   r   r   r   _prominent_peaksr!   zipr   r$   x0y0i0x1y1i1x2y2i2outr\   xyr   r   r   test_isolated_peaks  s   




"z&TestProminentPeaks.test_isolated_peaksc                 C   s0  t d}d\}}}d\}}}d\}}	}
||||f< ||||f< |
||	|f< tj|d d}t|d dks7J t|d |d |d	 D ]\}}}||||
fv sQJ ||||fv sZJ qCtj|d
d}t|d d	kslJ t|d |d |d	 D ]\}}}|||
fv sJ |||fv sJ |||	fv sJ qxd S )Nr   )rH   rJ   r-   )rC   rC   rJ   )r   r   r-   )	thresholdr   r0   r   rC   rg   r   r   r   r   r   test_threshold  s&   



""z!TestProminentPeaks.test_thresholdc                 C   s   t d}d\}}}d\}}}d\}}	}
||||f< ||||f< |
||	|f< tj|ddd}t|d t |f t|d t |f t|d	 t |f d S )
Nr   )rJ   rJ   r   )r   r   r   )r   r   r   r0   )min_xdistancemin_ydistancer   r   rC   )r   r   r   r   r   r   )r   r$   r   r   r   r   r   r   r   r   r   r   r   r   r   test_peaks_in_contact  s   



z(TestProminentPeaks.test_peaks_in_contactc                 C   sb   t d}t dt}d|d< d|d< | }tj||t dtdddd t ||ks/J d S )	Nr   r   r*   r0   r/   r   Fr   )	r   r   r   r   r   r   r   rt   rv   )r   r$   rQ   labelsinr   r   r   test_input_labels_unmodified'  s   

z/TestProminentPeaks.test_input_labels_unmodifiedc           
      C   s   t jddgtd}t d\}}|d d d }|d d d }d||| d || d  dk < t|\}}t|}tj|dd	|d
}	t	|	dksMJ d S )N  r+   )r   r   r   r-   TrC   @   F)r   rm   rQ   iq  )
r   r   rt   r   rq   labeldistance_transform_edtr   r   r!   )
r   maskr   r   x_cy_crQ   num_objsdist	local_maxr   r   r   test_many_objects3  s    
z$TestProminentPeaks.test_many_objectsN)r   r   r   r   r   r   r   r   r   r   r   r   r     s    r   )	itertoolsnumpyr   r   numpy.testingr   r   r   scipyr   rq   skimage._shared._warningsr   skimage.featurer   r   rX   r	   markparametrizeproductranger   r   r   r   r   r   r   r   <module>   s(       
&