o
    h?                     @   sn  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ejdddgejdg d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 ejdddgejdg dd+d, Z!ejdejejejgejd	d
dgd-d. Z"d/d0 Z#d1d2 Z$d3d4 Z%d5d6 Z&d7d8 Z'd9d: Z(d;d< Z)d=d> 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+   Z/var/www/html/scripts/venv/lib/python3.10/site-packages/skimage/feature/tests/test_blob.pyradius0      ztest_blob_dog.<locals>.radius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(   blobsr1   sthreshratio_threshb	img_emptyr+   r.   r0   test_blob_dog   sR   
rJ   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   rrV   im3r'   r(   rD   rH   r+   r+   r0   test_blob_dog_3dJ   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 )NrK   r   rL   rM   r   rO   r   r!   F)copy)      ?rP   rP   r   rK   rK   rQ   rR   r      r5   rP   rU   r"   r   )	r   r9   rV   r   astyperW   r>   r7   r8   rX   r+   r+   r0   test_blob_dog_3d_anisotropicm   s4   &"&rb   disc_centerr   r   r      exclude_border)r`   )r`   r`   r"      c                 C   sD  t d}t| d\}}d|||f< t|dddd}|jd dks%J d	|d }|d | d ks;J d
| d  d|d | d ksMJ d
| d  dt|ddd|d}| dkr|dkr|jd dksiJ d	|d }|d | d ksJ d
| d  d|d | d ksJ d
| d  dd S d}|jd dksJ |d S )Nr   r   r   r]   rQ   )r%   r&   rS   r   r5   "one blob should have been detectedblob should be  px from x border px from y border)r%   r&   rS   rg   re   rh   ?zero blobs should be detected, as only blob is 5 px from border)r9   r:   r   r   rW   rc   rg   rA   rB   rC   rD   rH   msgr+   r+   r0   test_blob_dog_exclude_border   s6   
$$$(rq   anisotropicFTndim)r5   r   rP   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   rs   rW   )rt   rs   rr   zr&   	blob_funcrD   expected_shaper+   r+   r0   test_nd_blob_no_peaks_shape   s   
r}   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      r   r   )r   A   r   r   )P   r   ri   )r#      r   )r         r   r5   r    r   r!   rf   r$   c                    r)   r*   r+   r,   r.   r+   r0   r1      r2   ztest_blob_log.<locals>.radiusr3   rP   r   r   r   r   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   r1   rE   rF   rH   rI   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      r`   rf   rK   皙?)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 )Nr`   rK   rL   rM   rP   r%   r&   r   rT   r5   r   r   r9   rV   r   rW   r>   r7   r8   rY   rV   rZ   rD   rH   r+   r+   r0   test_blob_log_3d1  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 )Nr`   rK   r   rL   rM   )r5   r   r   r^   r   r   r_   r5   rP   r"   r   r   r   r+   r+   r0   test_blob_log_3d_anisotropicB  s"   &"&r   c                 C   s<  t d}t| d\}}d|||f< t|ddd}|jd dks"J |d }|d | d ks8J d| d  d	|d | d ksJJ d| d  d
t|dd|d}| dkr|dkr|jd dkseJ d|d }|d | d ks{J d| d  d	|d | d ksJ d| d  d
d S d}|jd dksJ |d S )Nr   r   r   r]   r   r   r5   rk   rl   rm   )r%   r&   rg   re   rh   rj   rn   )r9   r:   r   r   rW   ro   r+   r+   r0   test_blob_log_exclude_borderX  s2   
$$$(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   rf   r     r#   r   r   (   r   r#   r   皙?r    r   r   r!   r5   <   rK   )r%   r&   r   r'   r(   c                 S      | d S r*   r+   r,   r+   r+   r0   r1        ztest_blob_doh.<locals>.radiusr3   r"   r   r   r   r   r   r   rP   r   r   )	r9   r:   r   r
   r;   r<   r   r=   r>   )r
   r   rA   rB   rC   r'   r<   r(   rD   r1   rE   rF   rH   r+   r+   r0   test_blob_doh{  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   rf   r   r   r   r   r   r   r#   r5   r   rK   Tr   )r%   r&   r   r   r'   c                 S   r   r*   r+   r,   r+   r+   r0   r1     r   z'test_blob_doh_log_scale.<locals>.radiusr3   r   r   r   r   r   r   r   rP   r   r   )r9   r:   uint8r   r   r=   r>   )rA   rB   rC   rD   r1   rE   rF   rH   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@   )rI   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 )Nr~   r   r6   rf   r   )x   r   r   r5   r   rK   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      rL   rM   	   r   rK   r   r%   r&   overlapr5   )r   r9   rV   
logical_orr   r   )r1r/   pad1pad2blob1blob2rZ   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 )	NrP   r   r   rK   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   rf   rK   r!   r   rP   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   rL   rM   r   )r   gGz @g
ףp=
 @rK   r   r   r5   r   r   g      ?r!   rP   r   )r   r9   rV   r   r   r   r	   r   r7   r8   r   piacos)	r   r/   r   r   r   r   rZ   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)rK   rK   r   r   r"   r   r   r   )imrD   r+   r+   r0   test_no_blobD  s   
r   )+r7   numpyr9   pytestnumpy.testingr   skimager   skimage.drawr   skimage.draw.draw3dr   skimage.featurer   r   r   skimage.feature.blobr	   markparametrizer   float16rw   float64rJ   r[   rb   rq   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r0   <module>   sj    8!$X!>1
