o
    :ήc]                  	   @   s   d dl Z d dlZd dlZd dl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_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 tdg tj|ddd}W d    n1 s4w   Y  |t	|k
 sDJ d S )N)   r	      min_distancer   indices argument is deprecatedFr   indices)npzerosr   peak_local_maxtypendarraysizer   astypeboolall)selftrivialpeak_indicespeaks r   F/tmp/pip-target-vg8gfxp4/lib/python/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#      r6   r
         ?r   threshold_relr   r   uint8r   r   r'   r   r   r*   r   r   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 )	Nr0   r1   r3   r4   r#   r5   r
   r   threshold_absr:   r<   r   r   r   test_absolute_threshold/   r>   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#      r1   r
   r   r   )r   fullr;   r   r   r'   r<   r   r   r   test_constant_image7   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 )Nr0   r1   r3   r
   r6   r      r   r   r;   r   r   r'   r<   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 )Nr0   r1   r#   r4   r3   r5   r
   r   r6   )r6   r3   )r
      r6   rE   )r
   )r
   r6   r$   r!   r!   r$   )r   r   r;   r   r   tolistr<   r   r   r   test_sorted_peaksB   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    r1   r3   r4      r
   r6      r
   r$      r6   r$   r!   r$   r6   r
   r   r?   r$   rH   )r   r@   	num_peaksrE   )r   r   r;   r'   r   r   r   r*   peaks_limitedr   r   r   test_num_peaksN   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    r1   r#   r3   r4   rK   rL   rM   rN   rO   rP   r!   rQ   r
   r   )r   r@   labelsr$   rH   )r   r@   rV   rR   rF   )r   r*   rV   rT   r   r   r   test_num_peaks_and_labelsd   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#   rY   r
   r3      rH   )rV   r   r9   rR   num_peaks_per_labelrO   rE   )	r   r%   seeduniformmgridr   r   infr'   )r   r*   ijrV   resultr   r   r   'test_num_peaks_tot_vs_labels_4quadrantss   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)r3   r3   d   r#   r$   r
   rH   )r   rR   )r   r   aranger   r   r'   rS   r   r   r   test_num_peaks3D   s   
z!TestPeakLocalMax.test_num_peaks3Dc              
   C   s0  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	dg t
j||dd|ddd}W d    n1 sw   Y  ||k sJ d S )N(   <   rZ   r   ri   rj   r
   r#   rY   rH   r$   rE   	   )r   r#   )r#   ri   )r   rY   )rY   rj   	footprintr   F)rV   r   r9   rp   r   exclude_borderr   r%   r^   r_   r   shapefloatndimaximum_filterr   r   r   r   r   r*   ra   rb   rV   rp   expectediminimaxjminjmaxrc   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 )Nrh   rZ   r   ri   rj   r
   r#   rY   rH   rk   rE   rl   rm   rn   ro   )axisF)rV   r   r9   rp   rq   )r   r%   r^   r_   r   rs   rt   ru   rv   stacknonzeroargsortr(   Tr   r   r   rw   r   r   r   test_indices_with_labels   s(   "
"z)TestPeakLocalMax.test_indices_with_labelsc                 C   sf   t d}d|d< tdg tj|ddd}W d    n1 s!w   Y  ||tk s1J d S )Nr$   r$   r$   r
   rH   rH   rH   r   Fr   )r   r   r   r   r   r   r   r   )r   nd_imager   r   r   r   test_ndarray_indices_false   s   
z+TestPeakLocalMax.test_ndarray_indices_falsec              	   C   s<  t d}d|g dg dg df< d|d< d|d< t j|td}d	|d< t j|td}d	|d< d	|d< d	|d< td
gW tj|dddd}t|| ttj|ddddtj|dd	dd ttj|ddddtj|dddd ttj|dddd| ttj|ddd|t W d    d S 1 sw   Y  d S )Nr   r
   )r
   r   r   )r   r
   r   )r   r   r
   )r6   r   r   r   r1   Tr   rH   F)r   rq   r   r   )rq   r   )	r   r   
zeros_liker   r   r   r   r   r   )r   r   rx   expectedNoBorderrc   r   r   r   test_ndarray_exclude_border   sX   

"z,TestPeakLocalMax.test_ndarray_exclude_borderc              
   C   st   t d}t dt}tdg tj||t dtddddd}W d    n1 s+w   Y  t | s8J d S )Nr3   r#   r   r5   r
   r   FrV   rp   r   r9   r   rq   	r   r   intr   r   r   onesr   r   r   r*   rV   rc   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)r3   r3   r3   )r6   r6   r6   r
   r   F)rp   r   r9   rq   )r   r   r   r   r   r   rs   ndim)r   r*   rc   r   r   r   test_empty_non2d_indices   s   

z)TestPeakLocalMax.test_empty_non2d_indicesc              
   C   s   t d}t dt}d|d< d|d< tdg tj||t dtddddd}W d    n1 s3w   Y  t ||dkksCJ d S )	Nr   r
   r0   r   r5   r   Fr   r   r   r   r   r   test_one_point   s   

zTestPeakLocalMax.test_one_pointc              
   C   s   t d}t dt}d|dddf< d|dddf< tdg tj||t dtddddd	}W d    n1 s;w   Y  t ||dkksKJ d S )
Nr   r
   r$      r   r5   r   Fr   r   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< |dk}tdg tj||t d	tdd
ddd}W d    n1 s?w   Y  t ||ksMJ tdg tj||dd
ddd}W d    n1 shw   Y  t ||ksvJ d S )Nr   r
   r0   r7   r$   r   r$   r   r   r5   r   Fr   )rV   r   r9   r   rq   r   r   r*   rV   rx   rc   r   r   r   test_adjacent_and_different  s*   

z,TestPeakLocalMax.test_adjacent_and_differentc              
   C   s   t d}t dt}d|d< d|d< d||dk< |dk}tdg tj||t dtddd	d	d
}W d    n1 s=w   Y  t ||ksKJ d S )Nr   r
   r0   r7   )r$   rO   r   r   r5   Fr   r   r   r   r   r   test_not_adjacent_and_different#  s   

z0TestPeakLocalMax.test_not_adjacent_and_differentc              
   C      t d}t dt}d|d< d|d< d|d< d|d< |dk}tdg tj||t d	tddd
d
d}W d    n1 s?w   Y  t ||ksMJ d S )Nr   r
   r0   r7   )r$   r[   rH   r   r   r5   Fr   r   r   r   r   r   test_two_objects1     

z!TestPeakLocalMax.test_two_objectsc              
   C   r   )Nr   r
   r0   r7   r   rH   r   r   r5   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	dg t
j|||ddddd}W d    n1 sw   Y  t ||ksJ d S )NrX   rZ   r   r#   rY   r
   r3   r[   rH   rk   rE   rl   ))r   r3   r   ))r   r[   )r[   rY   ro   r   Fr   rr   rw   r   r   r   test_four_quadrantsO  s.   z$TestPeakLocalMax.test_four_quadrantsc                 C   s   t jjdd}t dgg}tdg tj|t dt|dddddd}W d	   n1 s/w   Y  t 	|s;J tdg tj||dddd
}W d	   n1 sUw   Y  t 	|saJ d	S )zzregression test of img-1194, footprint = [1]
        Test peak.peak_local_max when every point is a local maximum
        r   rZ   r
   r   r   r~   F)rV   rp   r   r9   r@   r   rq   N)rp   r@   r   rq   )
r   r%   r^   arrayr   r   r   r   r   r   )r   r*   rp   rc   r   r   r   	test_diskd  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)rY   rY   rY   r
   )r[   r[   r[   r   r3   r   r8   r   Fr   r9   rq   r$   r   r   r   r   r   sortedrI   r   r*   r   r   r   test_3Dx  4   


zTestPeakLocalMax.test_3Dc                 C   r   )N)rY   rY   rY   rY   r
   )r[   r[   r[   r[   )r$   r$   r$   r$   r3   r   r8   r   Fr   r$   r   r   r   r   r   test_4D  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 )Nr0   r
   )rH   rH   r   rH   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_defaultN)__name__
__module____qualname__r   r/   r=   rA   rD   rG   rJ   rU   rW   rd   rg   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s:    
(
r   r   c                 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 )Nr0   r
   Frq   r   )r   rE   T)r   rq   )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 )Nr0   )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 )
NrB   )rB   rB   r
   r3   r#   r   rM      )rV   )	r   r%   r&   r   r   copyr   r   r   )imgrV   
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r[   r[   )rM   rO   r
   )rH   rH   r
   )r$   r"   r
   r   r6   r
   rH   r   r   r   _prominent_peaksr'   zipr   r*   x0y0i0x1y1i1x2y2i2outra   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   )rM   rO   r3   )rH   rH   rO   )r$   r"   r3   )	thresholdr   r6   r
   rH   rl   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   )rO   rO   r
   )r!   r!   r
   )r   r   r
   r6   )min_xdistancemin_ydistancer   r
   rH   )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   s   t d}t dt}d|d< d|d< | }tdg tj||t dtddddd	 W d    n1 s7w   Y  t 	||ksEJ d S )
Nr   r
   r0   r6   r   r5   r   Fr   )
r   r   r   r   r   r   r   r   r   r   )r   r*   rV   labelsinr   r   r   test_input_labels_unmodified1  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  r1   )r   r   r#   r3   TrH   @   F)r   rq   rV   iq  )
r   r   r   r   ru   labeldistance_transform_edtr   r   r'   )
r   maskr   r   x_cy_crV   num_objsdist	local_maxr   r   r   test_many_objects>  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   scipyr   ru   skimage._shared._warningsr   skimage.featurer   r%   r]   r   markparametrizeproductranger   r   r   r   r   r   r   r   <module>   s(        
&