U
    ?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ks*t|jdks8td S )N)   r
      min_distancer   )npzerosr   peak_local_maxtypeZndarrayAssertionErrorsize)selfZtrivialZpeak_indices r   Q/var/www/html/venv/lib/python3.8/site-packages/skimage/feature/tests/test_peak.pytest_trivial_case   s    
z"TestPeakLocalMax.test_trivial_casec                 C   sx   ddddg}dt jdd }|D ]\}}d|||f< q"tj|dd	}t|t|ksZt|D ]}t||ks^tq^d S )
N   r   )r      )r   r   )r   r   g?   r      r   )r   randomrandr   r   lenr   tuple)r   Zpeak_locationsimagercZ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@tt|dg d S )
Nr   r   Zdtype
   r   r   r      r+   r         ?r   threshold_relr   r   uint8r   r   r   r   r   r   r!   Zpeaksr   r   r   test_relative_threshold%   s    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@tt|dg d S )	Nr&   r'   r(   r)   r   r*   r   r   threshold_absr/   r1   r   r   r   test_absolute_threshold-   s    z(TestPeakLocalMax.test_absolute_thresholdc                 C   s4   t jddt jd}tj|dd}t|dks0td S )N)r   r      r'   r   r   r   )r   fullr0   r   r   r   r   r1   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sBtd S )Nr&   r'   r(   r   r+   r      r   r   r0   r   r   r   r   r1   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sJtt d
}d|d< tj|dd}| ddgddgdd	gddggkstd S )Nr&   r'   r   r)   r(   r*   r   r   r+   )r+   r(   )r      r+   r9   )r   )r   r+   r   r   r   r   )r   r   r0   r   r   tolistr   r1   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sTttj|dddd}t|dksvtd|kstd|ksttj|dddd}t|dkstd|kstd|kstd|kstd
|kstd S )Nr   r'   r(   r)      r   r+      r   r      r+   r   r   r   r+   r   r   r3   r   r<   )r   r4   	num_peaksr9   )r   r   r0   r   r   r   r   r   r!   peaks_limitedr   r   r   test_num_peaksL   s>    
      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snttj|dd|dd}t|dkstd S )Nr   r'   r   r(   r)   r?   r@   rA   rB   rC   rD   r   rE   r   r   )r   r4   labelsr   r<   )r   r4   rJ   rF   r:   )r   r!   rJ   rH   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stt	tj||ddt jdd}t|dkst	tj||ddd
d
d}t|d
kst	d S )Nr   r      r   r   r   rM   r   r(      r<   )rJ   r   r.   rF   Znum_peaks_per_labelrC   r9   )
r   r   seeduniformmgridr   r   infr   r   )r   r!   ijrJ   resultr   r   r   'test_num_peaks_tot_vs_labels_4quadrantsq   s2       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sDtd S )N)r(   r(   d   r   r   r   r<   )r   rF   )r   r   Zaranger   r   r   r   rG   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D ]6\}	}
tj||||	|
f |d||||	|
f< qq||k}t	j
||dd|dd}t j|td}d|t|j< ||k std S )N(   <   rN   r   r[   r\   r   r   rM   r<   r   r9   	   )r   r   )r   r[   )r   rM   )rM   r\   	footprintFrJ   r   r.   rb   exclude_borderr'   Tr   r   rQ   rR   r   shapefloatndimaximum_filterr   r   
zeros_likeboolr    Tallr   r   r!   rT   rU   rJ   rb   expectediminimaxjminjmaxpeak_idxrV   r   r   r   test_reorder_labels   s,     
 z$TestPeakLocalMax.test_reorder_labelsc                 C   sN  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D ]6\}	}
tj||||	|
f |d||||	|
f< qqt j	t 
||kdd}|t |t|j d d d  }tj||dd|dd}|t |t|j d d d  }||k sJtd S )NrZ   rN   r   r[   r\   r   r   rM   r<   r]   r9   r^   r_   r`   ra   ZaxisFrc   )r   r   rQ   rR   r   rf   rg   rh   ri   stackZnonzeroZargsortr    rl   r   r   rm   r   )r   r!   rT   rU   rJ   rb   ro   rp   rq   rr   rs   rV   r   r   r   test_indices_with_labels   s*     "
 "z)TestPeakLocalMax.test_indices_with_labelsc                 C   s,  t d}d|dddgdddgdddgf< d|d< d|d< t jdddggtd}t jdddgdddgdddg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'   r+   r   rd   TFrd   )r   r   arrayintr   r   r   rj   rk   r    rl   Zastype)r   Znd_imagero   ZexpectedNoBorderrV   rt   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sHt	d S )Nr(   r   r*   r   r   FrJ   rb   r   r.   rd   )
r   r   r~   r   r   onesrk   rf   ndimr   )r   r!   rJ   rV   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:td S )N)r(   r(   r(   )r+   r+   r+   r   r   F)rb   r   r.   rd   )	r   r   r   r   r   rk   rf   r   r   )r   r!   rV   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svtd S )
Nr   r   r&   r*   r   Fr   r'   T)r   r   r~   r   r   r   rk   rj   r    rl   rm   r   )r   r!   rJ   rt   rV   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      rv   rw   r*   r   Fr   
r   r   r~   rx   wherer   r   r   rk   r   r   r!   rJ   ro   rV   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&   r,   r   r   r   r   rv   rw   r*   r   Fr   )rJ   r   r.   rd   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&   r,   )r   rC   r   rv   rw   r*   Fr   r   r   r   r   r   test_not_adjacent_and_different  s    

 z0TestPeakLocalMax.test_not_adjacent_and_differentc                 C   sz   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&   r,   )r   rO   r<   r   rv   rw   r*   Fr   r   r   r   r   r   test_two_objects  s    

 z!TestPeakLocalMax.test_two_objectsc                 C   sz   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&   r,   r   r<   r   rv   rw   r*   Fr   r   r   r   r   r   test_adjacent_different_objects)  s    

 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D ]6\}	}
tj||||	|
f |d||||	|
f< qq||k}t	j
|||dddd}t j|td}d|t|j< t ||kstd S )NrL   rN   r   r   rM   r   r(   rO   r<   r]   r9   r^   ))r   r(   r   ))r   rO   )rO   rM   ra   Fr   r'   Tre   rn   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 |sfttj||ddd
}t j|t	d}d	|t
|j< t |stdS )zzregression test of img-1194, footprint = [1]
        Test peak.peak_local_max when every point is a local maximum
        r   rN   r   r   rv   F)rJ   rb   r   r.   r4   rd   r'   T)rb   r4   rd   N)r   r   rQ   r}   r   r   r   r~   rj   rk   r    rl   rm   r   )r   r!   rb   rt   rV   r   r   r   	test_diskL  s&     zTestPeakLocalMax.test_diskc                 C   s   t d}d|d< d|d< ttj|ddddddgg ttj|d	dddddgg ttj|ddd
d dddgdddggkstttj|ddd dddgdddggkstd S )N)rM   rM   rM   r   )rO   rO   rO   rz   r(   r   r-   rO   r   Fr   r.   rd   r   r   r   r   r   r   sortedr=   r   r   r!   r   r   r   test_3Da  s.    





zTestPeakLocalMax.test_3Dc                 C   s   t d}d|d< d|d< ttj|dddddddgg ttj|d	ddddddgg ttj|ddd
d ddddgddddggkstttj|ddd ddddgddddggkstd S )N)rM   rM   rM   rM   r   )rO   rO   rO   rO   )r   r   r   r   r(   r   r-   rO   r   Fr   r   r   r   r   r   r   test_4Ds  s.    



zTestPeakLocalMax.test_4Dc              	   C   s   t d}d|d< tt|dks(td|d< tt|ddgg d|d< tdg& ttj|dd|jd ksztW 5 Q R X d S )Nr&   r   )r<   r<   r   r<   zWhen min_distance < 1r   )	r   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s8ttj|ddd	}t|d
ksXtd
dg|kshtddg|ksxtd S )N)r(   r(   rv   )r<   r9   )r+   r   r+   r   r   r{   r<   r9   )r   r7   r   r   r   r   r   r1   r   r   r   test_peak_at_border  s    z$TestPeakLocalMax.test_peak_at_borderN)__name__
__module____qualname__r   r%   r2   r5   r8   r;   r>   rI   rK   rW   rY   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	      s8   	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,tttj|dddksFt| d dks^| d dkrdd}nd}ttj|ddd|kst| d dkrd}nd}ttj|d	d|kst| d dkrd}nd}ttj|d
d|kstd S )Nr&   r   Fr|   r   )r   r9   Tr{   )r   r   )r   r   )r   r   r   r   r   r   )r   r!   Zexpected_peaksr   r   r   test_exclude_border  s@    
    r   c               	   C   s   t d} tt tj| dds(tW 5 Q R X tt tj| ddsPtW 5 Q R X tt tj| ddsxtW 5 Q R X tt tj| ddstW 5 Q R X tt tj| ddstW 5 Q R X d S )Nr&   )r   r|   g      ?)r   a)r   rv   rv   )	r   r   pytestZraises
ValueErrorr   r   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 )
Nr6   )r6   r6   r   r(   r   r   rA      )rJ   )	r   r   r   r   r~   copyr   r   r   )ZimgrJ   Z
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sjtt|d |d |d D ]@\}}}||||
fkst||||fkst||||	fkstqd S )	NrO   rO   )rA   rC   r   )r<   r<   r   )r   r   r   r   r+   r   r<   r   r   r   _prominent_peaksr   r   zipr   r!   x0y0i0x1y1i1x2y2i2outrT   xyr   r   r   test_isolated_peaks  s    




"z&TestProminentPeaks.test_isolated_peaksc                 C   s4  t d}d\}}}d\}}}d\}}	}
||||f< ||||f< |
||	|f< tj|d d}t|d dksntt|d |d |d	 D ].\}}}||||
fkst||||fkstqtj|d
d}t|d d	kstt|d |d |d	 D ]>\}}}|||
fkst|||fkst|||	fkstqd S )Nr   )rA   rC   r(   )r<   r<   rC   )r   r   r(   )	thresholdr   r+   r   r<   r^   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   )rC   rC   r   )r   r   r   )r   r   r   r+   )Zmin_xdistanceZmin_ydistancer   r   r<   )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^t	d S )	Nr   r   r&   r+   r*   r   Fr   )
r   r   r~   r   r   r   r   rk   rm   r   )r   r!   rJ   Z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st
d S )N  r'   )r   r   r   r(   Tr<   @   F)r   rd   rJ   iq  )r   r   rk   r   rh   labelZdistance_transform_edtr   r   r   r   )
r   maskr   r   Zx_cZy_crJ   Znum_objsdistZ	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   Znumpy.testingr   r   r   Zscipyr   rh   Zskimage._shared._warningsr   Zskimage.featurer   r   rP   r	   markZparametrizeproductranger   r   r   r   r   r   r   r   <module>   s&      
&