o
    :ήc:                     @   s&  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 dlmZmZmZ d dlmZ ejdejejejejgejd	d
dgdd Zejdejejejejgejd	d
dgdd Zejdejejejejgejd	d
dgdd Zdd Zejdddgejdg dejdddgdd Zejdejejejejgejd	d
dgdd Zd d! Zd"d# Zd$d% Z d&d' Z!ejdejejejgejd	d
dgd(d) Z"d*d+ Z#d,d- Z$d.d/ Z%d0d1 Z&d2d3 Z'd4d5 Z(d6d7 Z)d8d9 Z*dS ):    N)assert_almost_equal)feature)disk)	ellipsoid)blob_dogblob_dohblob_log)_blob_overlapdtypethreshold_typeabsoluterelativec                    s  t d tjd| d}tdd\}}d|||f< tdd\}}d|||f< td	d
\}}d|||f< |dkrHd}|jjdkrE||  }d }n|dkrPd }d}t|dd||d} fdd}t	||d}	d}
d}|	d }t
|d d |
ksyJ t
|d d |
ksJ t
||d |d ksJ |	d }t
|d d |
ksJ t
|d d |
ksJ t
||d |d ksJ |	d }t
|d d |
ksJ t
|d d |
ksJ t
||d
 |d
 ksJ tjd| d}t|jdksJ d S ) N      r   r
              d   ,        ^  -   r          @fr         ?   2   	min_sigma	max_sigma	thresholdthreshold_relc                        | d  S Nr    xr2r+   F/tmp/pip-target-vg8gfxp4/lib/python/skimage/feature/tests/test_blob.py<lambda>0       ztest_blob_dog.<locals>.<lambda>keyg      ?r   r      r   r   r   r   r   r   r   )mathsqrtnponesr   r
   kindptpr   sortedabszerossize)r
   r   imgxsysr'   r(   blobsradiussthreshratio_threshb	img_emptyr+   r.   r0   test_blob_dog   sR   
rK   c           	      C   s   d}d}t |||}tj||dd}|dkrd}d}n|dkr#d}d}t|d	dd
||d}|d }|jdks8J |d || d ksDJ |d || d ksPJ |d || d ks\J ttd	|d	  | dk smJ d S )N
   constantmoder   MbP?r   r   r!      333333?r%   r&   sigma_ratior'   r(   r"   r5   r   皙?)r   r9   padr   shaper>   r7   r8   	r
   r   rrW   im3r'   r(   rD   rI   r+   r+   r0   test_blob_dog_3dI   s0   &r\   c           	      C   s@  d}d}t |d ||}tj||dd}|dkrd}d }n|dkr%d }d}t|j| d	d
g dg dd||d}|d }|jdksCJ |d |d | d ksQJ |d || d ks]J |d || d ksiJ ttd|d  |d  dk s|J ttd|d  | dk sJ ttd|d  | dk sJ d S )NrL   r   rM   rN   r   rP   r   r!   F)copy)      ?rQ   rQ   r   rL   rL   rR   rS   r      r5   rQ   rV   r"   r   )	r   r9   rW   r   astyperX   r>   r7   r8   rY   r+   r+   r0   test_blob_dog_3d_anisotropicl   s4   &"&rc   c                  C   s   t d} tdd\}}d| ||f< t| dddd}|jd d	ks#J |d }|d |d	   kr8dks=J d
 J d
t| ddddd}d}|jd dksSJ |d S )Nr   r   r   r   r   r^   rR   )r%   r&   rT   r   r5   (blob should be 5 px from x and y bordersra   )r%   r&   rT   exclude_border?zero blobs should be detected, as only blob is 5 px from border)r9   r:   r   r   rX   rA   rB   rC   rD   rI   msgr+   r+   r0   test_blob_dog_excl_border   s*   
,rj   anisotropicFTndim)r5   r   rQ   r"   function_namer   r   c                 C   sp   t jd| t jd}|rdt | }nd}tt| }|||d}|r(d|j n|jd }|jd|fks6J d S )N)   r      )r&   r   r5   r   )r9   r?   float32arangegetattrr   rl   rX   )rm   rl   rk   zr&   	blob_funcrD   expected_shaper+   r+   r0   test_nd_blob_no_peaks_shape   s   
rv   c                    s  t d tjd| d}tdd\}}d|||f< tdd\}}d|||f< td	d
\}}d|||f< tdd\}}d|||f< |dkrUd}|jjdkrR||  }d }n|dkr]d }d}t|dd||d} fdd}t	||d}	d}
|	d }t
|d d |
ksJ t
|d d |
ksJ t
||d |
ksJ |	d }t
|d d |
ksJ t
|d d
 |
ksJ t
||d |
ksJ |	d }t
|d d |
ksJ t
|d d |
ksJ t
||d
 |
ksJ |	d }t
|d d |
ksJ t
|d d |
ks	J t
||d |
ksJ t|dd||d d!}|	d }t
|d d |
ks1J t
|d d |
ks>J t
||d |
ksKJ |	d }t
|d d |
ks\J t
|d d
 |
ksiJ t
||d |
ksvJ |	d }t
|d d |
ksJ t
|d d |
ksJ t
||d
 |
ksJ |	d }t
|d d |
ksJ t
|d d |
ksJ t
||d |
ksJ td"}t|jdksJ d S )#Nr      rx   r   )r   A   r   r   )P   r      )r#      r   )r         r   r5   r    r   r!      r$   c                    r)   r*   r+   r,   r.   r+   r0   r1      r2   ztest_blob_log.<locals>.<lambda>r3   rQ   r   r   ry   rz   r#   r|   r   r}   T)r%   r&   r'   r(   	log_scaler6   )r7   r8   r9   r:   r   r
   r;   r<   r   r=   r>   r?   r@   )r
   r   rA   rB   rC   r'   r(   rD   rE   rF   rG   rI   rJ   r+   r.   r0   test_blob_log   s   


r   c                  C   sR   t d} tdd\}}d| ||f< tdd\}}d| ||f< t| dddd	 d S )
N)   r   rd   r   r      ra   r   rL   皙?)r&   	num_sigmar'   )r9   r:   r   r   )rA   rB   rC   r+   r+   r0   test_blob_log_no_warnings  s   
r   c                  C   s   d} d}t | | | }tj||dd}t|ddd}|d }|jdks$J |d | | d	 ks0J |d	 | | d	 ks<J |d
 | | d	 ksHJ ttd|d  |  d	k sYJ d S )Nra   rL   rM   rN   rQ   r%   r&   r   rU   r5   r   r   r9   rW   r   rX   r>   r7   r8   rZ   rW   r[   rD   rI   r+   r+   r0   test_blob_log_3d%  s   &r   c                  C   s  d} d}t | d | | }tj||dd}t|g dg dd}|d	 }|jd
ks*J |d	 | d | d ks8J |d | | d ksDJ |d | | d ksPJ ttd|d  | d  dk scJ ttd|d  |  dk stJ ttd|d  |  dk sJ d S )Nra   rL   r   rM   rN   )r5   r   r   r_   r   r   r`   r5   rQ   r"   r   r   r   r+   r+   r0   test_blob_log_3d_anisotropic6  s"   &"&r   c                  C   s   t d} tdd\}}d| ||f< t| ddd}|jd dks"J |d }|d |d   kr7dks<J d	 J d	t| ddd
d}d}|jd dksQJ |d S )Nr   rd   r   r   r^   r   r   r5   re   ra   )r%   r&   rf   rg   )r9   r:   r   r   rX   rh   r+   r+   r0   test_blob_log_exclude_borderM  s&   
,r   c                 C   s,  t jd| d}tdd\}}d|||f< tdd\}}d|||f< tdd	\}}d|||f< td
d\}}d|||f< |dkrTd}|jjdkrQ| }||d 9 }d }n|dkr\d }d}t|ddd||d}dd }	t||	d}
d}|
d }t|d d |ksJ t|d d |ksJ t|	|d |ksJ |
d }t|d d |ksJ t|d d |ksJ t|	|d |ksJ |
d }t|d d |ksJ t|d d |ksJ t|	|d	 |ksJ |
d  }t|d d! |ksJ t|d d" |ksJ t|	|d |ksJ d S )#Nr   r   r   r   r     r#   r~   r   (   r   r#   r   皙?r    r   r   r!   r5   <   rL   )r%   r&   r   r'   r(   c                 S      | d S r*   r+   r,   r+   r+   r0   r1         ztest_blob_doh.<locals>.<lambda>r3   r"   r   r   r   r   r   r   rQ   r   r   )	r9   r:   r   r
   r;   r<   r   r=   r>   )r
   r   rA   rB   rC   r'   r<   r(   rD   rE   rF   rG   rI   r+   r+   r0   test_blob_dohf  sZ   r   c                  C   s  t jdt jd} tdd\}}d| ||f< tdd\}}d| ||f< tdd	\}}d| ||f< td
d\}}d| ||f< t| dddddd}dd }t||d}d}|d }t|d d |ksbJ t|d d |ksnJ t||d |kszJ |d }t|d d |ksJ t|d d |ksJ t||d |ksJ |d }t|d d |ksJ t|d d |ksJ t||d	 |ksJ |d }t|d d |ksJ t|d d |ksJ t||d |ksJ d S )Nr   r   r   r   r   r   r~   r   r   r   r#   r5   r   rL   Tr   )r%   r&   r   r   r'   c                 S   r   r*   r+   r,   r+   r+   r0   r1     r   z)test_blob_doh_log_scale.<locals>.<lambda>r3   r   r   r   r   r   r   r   rQ   r   r   )r9   r:   uint8r   r   r=   r>   )rA   rB   rC   rD   rE   rF   rG   rI   r+   r+   r0   test_blob_doh_log_scale  sH   r   c                  C   s    t d} t| jdksJ d S )Nr6   r   )r9   r?   r   r@   )rJ   r+   r+   r0   test_blob_doh_no_peaks  s   
r   c                  C   sj   t jdt jd} tdd\}}d| ||f< tdd\}}d| ||f< t| dd	d
dd}t|dks3J d S )Nrw   r   r6   r   r   )x   r   r~   r5   r   rL   r   )r%   r&   r   r'   )r9   r:   r   r   r   len)rA   rB   rC   rD   r+   r+   r0   test_blob_doh_overlap  s   r   c                  C   s   d\} }d\}}t | | | }tj||dd}t |||}tj|||f|d |d f||fgdd}t||}t|dddd	}t|d
ksGJ d S )Nr   r      rM   rN   	   r   rL   r   r%   r&   overlapr5   )r   r9   rW   
logical_orr   r   )r1r/   pad1pad2blob1blob2r[   rD   r+   r+   r0   test_blob_log_overlap_3d  s   r   c                  C   s   t d} ttdddd|  d|  d|  gtdddd|  d|  d|  gdd}t|d ttdddd|  d|  d|  gtdddd|  d|  d|  gdd}t|d d S )	NrQ   r   r   rL   g?r5   )	sigma_dimg?)r7   r8   r	   r9   arrayr   )s3r   r+   r+   r0    test_blob_overlap_3d_anisotropic  s   
" 
" r   c                  C   sf   t d} d| dddf< t| dddd}t|dksJ t| dd	gddgdd}t|dks1J d S )
N)r#   r#   r5   r   rL   r!   r   rQ   r%   r&   r   r   r9   r?   r   r   )imageisotropic_blobs	ani_blobsr+   r+   r0   test_blob_log_anisotropic  s   
r   c            	   
   C   s   d\} }d\}}t | | | }tj||dd}t |||}tj|||f|d |d f||fgdd}t||}t|g dddd	}t|d
ksIJ ttdddt	d gtdddt	d g}t
|dtj dtd t	dd    d S )Nr   r   rM   rN   r   )r   gGz @g
ףp=
 @rL   r   r   r5   r   r   g      ?r!   rQ   r   )r   r9   rW   r   r   r   r	   r   r7   r8   r   piacos)	r   r/   r   r   r   r   r[   rD   r   r+   r+   r0   $test_blob_log_overlap_3d_anisotropic  s*   
$r   c                  C   s.   t d} t| dddd}t|dksJ d S )N)rL   rL   r   r   r"   r   r   r   )imrD   r+   r+   r0   test_no_blob-  s   
r   )+r7   numpyr9   pytestnumpy.testingr   skimager   skimage.drawr   skimage.draw.draw3dr   skimage.featurer   r   r   skimage.feature.blobr	   markparametrizer   float16rp   float64rK   r\   rc   rj   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r0   <module>   sb    7!W=0
