a
    
d
                     @   s  d dl Z d dlZ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mZmZmZ d dlmZ d dlmZmZ d dlmZmZ d dlmZ zd dlZW n ey   dZY n0 dZejd	 ee dd
dd
f Ze eZ!e"e!dksJ ee# Z$e%e$Z#e"e$dks"J e!ddddf Z&eddddf Z'ej(ej)ej*gZ+ze+ej,g7 Z+W n e-y~   Y n0 ej./de+dd Z0ej./dg ddd Z1dd Z2dd Z3dd Z4dd Z5dd Z6dd Z7d d! Z8d"d# Z9ej./dg dd$d% Z:d&d' Z;d(d) Z<d*d+ Z=d,d- Z>d.d/ Z?d0d1 Z@ej./dej)ej*gd2d3 ZAej./dej)ej*gd4d5 ZBd6d7 ZCd8d9 ZDej./dg d:d;d< ZEd=d> ZFd?d@ ZGdAdB ZHdCdD ZIej./dEdFdGgdHdI ZJej./dEdFdGgej./dJg dKej./ddLdMgdNdO ZKej./dEdFdGgej./ddLdMgdPdQ ZLej./dEdFdGgej./dg dRej./dd dgdSdT ZMdUdV ZNdWdX ZOdYdZ ZPej./dEdFdGgej./ddLdMgd[d\ ZQej./dEdFdGgd]d^ ZRej./dEdFdGgd_d` ZSej./dae!ddFfe&ddFfe'ddFfe'ddGfgdbdc ZTej./dg dej./dddFdGgdedf ZUej./dgeVdhdigej(ej)ej*ejWejXgdGdFgdGdFgdjdk ZYdldm ZZej./dneVdGdFgdodpge[dqdrdsdt Z\dudv Z]ej./dwdGdFgdxdy Z^dzd{ Z_d|d} Z`ej./dg dd~d Zaej./dwdGdFgdd Zbej./dwdGdFgdd Zcej./dddgej./dwdGdFgdd Zddd ZedS )    N)assert_array_almost_equalassert_array_equalassert_warns)colordataimg_as_floatrestoration)expected_warnings)_supported_float_typeslice_at_axis)peak_signal_noise_ratiostructural_similarity)_wavelet_thresholdz-The optional dask dependency is not installed           ?dtypec                 C   s   t j| dd}|d|  tjj|j  7 }t|dd}tj	|dd}|j
t|j
ks\J ddlm} t|j
}|j|d	d}|j|d
d}|j|d
d}|j
|ksJ t|d  t|d  k sJ d S )NTcopy      ?r      皙?weight)ndimageF)   r   )size   )
astro_grayastypestdnprandomrandshapeclipr   denoise_tv_chamboller   r
   Zscipyr   Zmorphological_gradientsqrtsum)r   imgZdenoised_astroZndiZfloat_dtypeZgradZgrad_denoised r+   o/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/skimage/restoration/tests/test_denoise.pytest_denoise_tv_chambolle_2d2   s    
r-   channel_axis)r   r   r   r   c                 C   s  t jtd dd}ttd| }t j|d| d}tjt| |j d}t	||d | t
td dd dtjd d f g d	}d
|d d d d dd d f  |d d d d dd d f< t j|d dd}t|d| }t j|d| d}tjt| |j d}t	||d | d S )N.r   r   r   r   r   r.   Zaxisr   @   )r   r   r   r   r   )r   r'   astror"   moveaxis	functoolspartialr   ndimr   tileZnewaxis)r.   	denoised0r*   denoised_atZastro3r+   r+   r,   &test_denoise_tv_chambolle_multichannelK   s$    *8r<   c                  C   sn   t } t| dtj}t|dks*J tj|dd}|jt	ksFJ t|dksXJ t
|dksjJ d S )N   r   r   r   r           )r   r"   multiplyr    uint8maxr   r'   r   floatminr*   Z	int_astroZdenoised_int_astror+   r+   r,   ,test_denoise_tv_chambolle_float_result_rangec   s    rE   c                  C   s   t jddddddf \} }}| d d |d d  |d d  dk }d|t }|d	7 }|dt jj|j  7 }d||dk < d
||d
k< tj|t j	dd}|j
tksJ | d
 | k sJ dS )zEApply the TV denoising algorithm on a 3D image representing a sphere.r   (      r         r2   d   <   r=   r   r   N)r"   Zogridr    rB   r#   r$   r%   r   r'   r@   r   r!   )xyzmaskresr+   r+   r,   test_denoise_tv_chambolle_3dp   s    "(rQ   c               	   C   s   ddt t ddt j d  } | dt j| j 7 } t | dd} tj	| 
t jdd	}|jtksjJ | d |  k sJ d
S )z2Apply the TV denoising algorithm on a 1D sinusoid.}   rJ   r      i  rH   r=   r   r   N)r"   sinlinspacepir#   r$   r   r&   r   r'   r    r@   r   rB   r!   )rL   rP   r+   r+   r,   test_denoise_tv_chambolle_1d~   s    "rW   c                  C   sV   dt jdddd } tj| t jdd}|jtks:J |	 d | 	 k sRJ dS )z TV denoising for a 4D input.r=   rS   r   r   N)
r"   r#   r$   r   r'   r    r@   r   rB   r!   )ZimrP   r+   r+   r,   test_denoise_tv_chambolle_4d   s    rX   c            	      C   s   t jd} t }|d| |j 7 }t |dd}tt|dd}t 	|d d}d	}t
j||d
}t
j||d
}|jt jksJ |jt jksJ t|tdd}t||d d d d ddf dd}|dksJ ||ksJ d S )Nr   g333333?r   r   r   
data_range).NN)r   r   r   r   皙?r   g\(\?)r"   r#   default_rngr   r   standard_normalr%   r&   r   r8   r   r'   r   float64)	rstateZimg2dZ
ssim_noisyZimg4dwZdenoised_2ddenoised_4dZssim_2dZssimr+   r+   r,   #test_denoise_tv_chambolle_weighting   s    "rb   c                  C   s   t  } | d|   tjj| j  7 } t| dd} tj	| dd}tj	| dd}| dddd	f  |dddd	f  ksJ |dddd	f  |dddd	f  ksJ d S 
Nr   r   r   
   r         -      )
checkerboard_grayr   r!   r"   r#   r$   r%   r&   r   denoise_tv_bregmanr*   out1out2r+   r+   r,   test_denoise_tv_bregman_2d   s    4rn   c                  C   sr   t  } t| dtj}t|dks.J tj|dd}|j	t
ksJJ t|dks\J t|dksnJ d S )Nr=   r         N@r   r   r>   )r   r   r"   r?   r    r@   rA   r   rj   r   rB   rC   rD   r+   r+   r,   *test_denoise_tv_bregman_float_result_range   s    rp   c                  C   s   t  } | d|   tjj| j  7 } t| dd} tj	| dd}tj	| dd}| dddd	f  |dddd	f  ksJ |dddd	f  |dddd	f  ksJ d S rc   )
checkerboardr   r!   r"   r#   r$   r%   r&   r   rj   rk   r+   r+   r,   test_denoise_tv_bregman_3d   s    4rr   c                 C   sb   t  }tj|d dd}t|d| }tj|d| d}tjt| |j	 d}t
|||d  d S )Nr/   ro   r   r   r0   r1   r   )r3   r   r   rj   r"   r4   r5   r6   r   r7   r   )r.   Z	img_astror9   r:   r;   r+   r+   r,   'test_denoise_tv_bregman_3d_multichannel   s    rs   c                  C   sp   t  d dd df } | d|   tjj| j  7 } t| dd} tj	| dd}tj	| ddd}t
|| d S )	N2   r   r   r   ro   r   r   r0   )ri   r   r!   r"   r#   r$   r%   r&   r   rj   r   rk   r+   r+   r,   $test_denoise_tv_bregman_multichannel   s    ru   c                  C   s"   t d} t| }t||  d S Nrt   rt   )r"   zerosr   denoise_bilateralr   r*   outr+   r+   r,   test_denoise_bilateral_null   s    

r|   c                  C   s$   t d } t| }t||  d S rv   )r"   onesr   ry   r   rz   r+   r+   r,   test_denoise_bilateral_negative   s    
r~   c                  C   s<   t d} d| d< t| }t| d }t||d  d S )Nrw   r   )r   r   rd   )r"   r}   r   ry   r   rk   r+   r+   r,    test_denoise_bilateral_negative2   s
    

r   c                  C   s   t  d dd df } | d|   tjj| j  7 } t| dd} tj	| ddd d}tj	| dd	d d}| d
dddf  |d
dddf  ksJ |d
dddf  |d
dddf  ksJ d S )Nrt   r   r   r   r   rd   Zsigma_colorZsigma_spatialr.   r[   rH   rf   rg   re   rh   )
ri   r   r!   r"   r#   r$   r%   r&   r   ry   rk   r+   r+   r,   test_denoise_bilateral_2d  s    4r   c                  C   sR   t t ddddf } tj| dddd}ttj|ddd	}t|d d
S )zTThis test checks if the bilateral filter is returning an image
    correctly padded.rJ      r   rd   r   r   r   gMbP?ZatolN)	r   r   Zchelsear   ry   r"   Zcount_nonzeroiscloser   )r*   Zimg_bilZcondition_paddingr+   r+   r,   test_denoise_bilateral_pad  s    
r   c                 C   s`   t  d dd df }|d|  tjj|j  7 }t|dd| }t	j
|ddd d d S )Nrt   r   r   r   r   rd   r   )ri   r   r!   r"   r#   r$   r%   r&   r    r   ry   r   r*   r+   r+   r,   test_denoise_bilateral_types!  s    r   c                 C   s\   t  d dd df }|d|  tjj|j  7 }t|dd| }t	j
|dd d S )Nrt   r   r   r   re   r   )ri   r   r!   r"   r#   r$   r%   r&   r    r   rj   r   r+   r+   r,   test_denoise_bregman_types-  s    r   c                  C   s"   t d} t| tj| d d d S )Nrd   rd   r.   )r"   rx   r   r   ry   r*   r+   r+   r,   test_denoise_bilateral_zeros8  s    
r   c                  C   s&   t dd } t| tj| d d d S )Nr   re   r   )r"   r}   r   r   ry   r   r+   r+   r,   test_denoise_bilateral_constant>  s    r   )r   r   r   c                 C   s  t  d dd df }|d|  tjj|j  7 }t|dd}t|d| }t	j
|dd| d}t	j
|d	d
| d}t|| d}t|| d}t|| d}|ddddf  |ddddf  ksJ |ddddf  |ddddf  ks
J d S )Nrt   r   r   r   r   r   rd   r   r[   rH   rf   rg   re   rh   )rq   r   r!   r"   r#   r$   r%   r&   r4   r   ry   )r.   r*   rl   rm   r+   r+   r,   test_denoise_bilateral_colorD  s"    4r   c                  C   sF   t d} tt tj| d d W d    n1 s80    Y  d S )N)rt   rt   r   r   r"   r}   pytestraises
ValueErrorr   ry   r   r+   r+   r,   #test_denoise_bilateral_3d_grayscale[  s    
r   c                  C   sP   t d} tdg tj| dd}W d    n1 s80    Y  t||  d S )N)rt   rt   rt   Z	grayscaler   r   )r"   r}   r	   r   ry   r   )r*   resultr+   r+   r,   &test_denoise_bilateral_3d_multichannela  s    
,r   c                  C   s~   t d} tt tj| d d W d    n1 s80    Y  tt tj| dd W d    n1 sp0    Y  d S )N)rd   rd   rd   rd   r   r   r   r   r+   r+   r,   'test_denoise_bilateral_multidimensionali  s
    
,r   c                  C   sT   t dt j} tdg tj| d d}W d    n1 s<0    Y  t| | d S )Nrw   zinvalid|\A\Zr   )r"   fullNaNr	   r   ry   r   rz   r+   r+   r,   test_denoise_bilateral_nanq  s    ,r   	fast_modeFTc              
   C   s   t d}d|ddddf< d}||t j|j 7 }|d}|dfD ]p}tj|dd	d
| d |d}| | kszJ tj|dd	d
| d |d}| | ksJ t j	||ddsJJ qJd S )NrF   rF   r   rd   333333?float32r      re   r[   )r   r.   sigma{Gz?r   )
r"   rx   r#   r]   r%   r    r   denoise_nl_meansr!   allclose)r   r*   r   img_f32sr:   Zdenoised_f32r+   r+   r,   test_denoise_nl_means_2dz  s&    

r   
n_channels)r   r      r^   r   c           
   
   C   s   t td dd df }t |fd }||}d}||t j|j  }t |dd}||}|dfD ]|}t	|dd |f |dd |f }t
j|dd |f ddd	| | d
|d}t	|dd |f |dd |f }	|	|ksnJ qnd S )Nrt   r   r   r   r   .r   re         ?r   hr   r.   r   )r"   r   r3   Zconcatenater    r#   r]   r%   r&   r   r   r   )
r   r   r   r*   r   imgnr   
psnr_noisyr:   psnr_denoisedr+   r+   r,   %test_denoise_nl_means_2d_multichannel  s*    


r   c              
   C   s   t jd|d}d|ddddddf< d}||t j|j  }||}t||}|d	fD ]2}tj|d
dd| | d |d}t|||ks^J q^d S )N   r   rS   r   r   re   r   r   r   r      r   r   )	r"   rx   r#   r]   r%   r    r   r   r   )r   r   r*   r   r   r   r   r:   r+   r+   r,   test_denoise_nl_means_3d  s    

r   )r^   r   float16c              	   C   s   t jdddd}|d d d dd df j|dd}d	}tjd}||||j  }||}tj	|
 dd
d| || d d}t|d|}tj	|
 dd
d| || |d}t||d}||j}t||}	t||}
|
|	ksJ d S )N    r   re   )lengthZn_dimrng      Fr   r[   r   g333333?)r   r   r   r.   r   )r   Zbinary_blobsr    r"   r#   r\   r]   r%   r   r   r   r4   r   r   )r   r   r.   r*   r   r   r   Zdenoised_ok_multichannelZdenoised_wrong_multichannelZ
psnr_wrongZpsnr_okr+   r+   r,   "test_denoise_nl_means_multichannel  s,    $


r   c                  C   sX  t jd} t d}d|ddddddd df< d|dddddddd f< d}||| |j  }tddd| |d	d
}t||dd}t |}t	|jd D ]*}t
j|d|f fdd i||d|f< qt||dd}||ksJ t
j|fdd i|}	t||	dd}
|
|ks"J t
j|fddi|}t||dd}||ksTJ d S )Nre   )rd   rd   rS   re   r   r   r   r   r   r   T)Z
patch_sizepatch_distancer   r   r   rY   r   .r.   )r"   r#   r\   rx   r]   r%   dictr   Z
zeros_likeranger   r   )r   r*   r   r   Znlmeans_kwargsr   Zdenoised_3dchZpsnr_3dra   Zpsnr_4dZdenoised_3dmcZ	psnr_3dmcr+   r+   r,   test_denoise_nl_means_4d  sF    
  



r   c               	   C   s   t d} d| ddddddddd d f< d}| |t jj| j   }t| |dd}tj|d	d	d
| dd|d}t| |dd}||ksJ d S )N)rS   rS   rS   r   r   r   r   r   r   r   r   rY   r   gffffff?Tr   )r"   rx   r#   Zrandnr%   r   r   r   )r*   r   r   r   Zdenoised_4dmcZ	psnr_4dmcr+   r+   r,   %test_denoise_nl_means_4d_multichannel  s    
&r   c                  C   s  t d} tt tj| d d W d    n1 s80    Y  t d} tt tj| dd W d    n1 sz0    Y  t d} tt  tj| ddd W d    n1 s0    Y  t d} tt  tj| d dd W d    n1 s0    Y  t d} tt  tj| ddd W d    n1 sJ0    Y  t d} tt tj| d d W d    n1 s0    Y  d S )	N)re   r   )re   r   r   )re   re   re   re   F)r.   r   )re   re   re   re   re   )r"   rx   r   r   NotImplementedErrorr   r   r   r+   r+   r,   %test_denoise_nl_means_wrong_dimension  s$    
,
,
.
0
0
r   c                 C   s   t d}d|ddddf< |dt j|j 7 }||}tj|ddd| d d	}t ||sdJ tj|ddd| d d	}t ||sJ d S )
Nr   r   rd   r   r   r   re   r   )r   r.   )	r"   rx   r#   r]   r%   r    r   r   r   )r   r   r*   r:   r+   r+   r,   test_no_denoising_for_small_h<  s    

r   c                 C   sr   t jdtd}|d}|d}tj|| djdks:J tj|| dj|jksTJ tj|| dj|jksnJ d S )Nr   r   r   r^   )r   r"   rx   intr    r   r   r   r   r*   r   Zimg_f64r+   r+   r,   test_denoise_nl_means_2d_dtypeN  s$    

r   c                 C   sx   t jdtd}|d}|d}tj|d| djdks<J tj|d| dj|jksXJ tj|d| dj|jkstJ d S )Nr   r   r   r^   r   )r   r   r   r   r+   r+   r,   test_denoise_nl_means_3d_dtype^  s$    

r   z img, channel_axis, convert2ycbcrc                 C   s  t jd}d}| ||| j  }t |dd}tj||||dd}t| |}t| |}||ksfJ tj|||dd}t| |}t| |}||ksJ tj||d|dd}	t| |	}
||
ksJ |
|ksJ tj|d	| |dd
}tj|||dd
}t 	|d	 t 	|d	 ksJ d S )Nr   r   r   r   Tr   r.   convert2ycbcrrescale_sigma)r.   r   r   )r.   wavelet_levelsr   r   r   r   r.   r   )
r"   r#   r\   r]   r%   r&   r   denoise_waveletr   r)   )r*   r.   r   r_   r   noisyr:   r   r   
denoised_1psnr_denoised_1Zres1Zres2r+   r+   r,   test_wavelet_denoisingn  sL    




r   r   c           	      C   s   t jd}d}t}||||j  }t |dd}t |d| }t |d| }tj	||| |dd}t
||}t
||}||ksJ d S )Nr   r   r   r   r   Tr   )r"   r#   r\   	astro_oddr]   r%   r&   r4   r   r   r   )	r.   r   r_   r   r*   r   r:   r   r   r+   r+   r,   #test_wavelet_denoising_channel_axis  s    

r   z*case, dtype, convert2ycbcr, estimate_sigma1d2d multichannelc              	   C   s  t jd}| dkr$t ddd}n | dkrDt ddddf }||}d	}||||j  }t 	||
 | }||j}|jd
 dkrd
nd}|rtj||d}	nd}	|r
|du r
tt& tj||	d||dd}
W d   n1 s0    Y  dS tj||	d||dd}
|
jt|jks6J | |
  }t|||d}t |jdk}|st||
|d}|
 d|  ksJ npt|}| |
  }t||
|d}|
 dksJ t |jdkr|

 dksJ n|

 d
ksJ ||ksJ dS )z:Test cases for images without prescaling via img_as_float.r   r   r   r=   i   r   Nr2   g      9@r   r   r   Zsym4T)r   waveletr.   r   r   rY   fg?r   u)r"   r#   r\   rU   r   	astronautr    r]   r%   r&   rC   rA   r   r   estimate_sigmar   r   r   r   r
   r   kindr   )Zcaser   r   r   r_   rL   r   r   r.   	sigma_estr:   rZ   r   Zclippedr   Z
x_as_floatZf_data_ranger+   r+   r,   test_wavelet_denoising_scaling  sf    
$r   c                  C   s   t jd} t}d}||| |j  }t |dd}t|dd |d}t||}t||}||ksfJ t	
t  t|dd d d W d    n1 s0    Y  tdg  t|dd|d W d    n1 s0    Y  d S )	Nr   r   r   r   db1)r   method	thresholdzThresholding method BayesShrink)r"   r#   r\   r   r]   r%   r&   r   r   r   r   r   r	   )r_   r*   r   r   r:   r   r   r+   r+   r,   test_wavelet_threshold  s"    

.r   zrescale_sigma, method, ndimZ
VisuShrinkr   r   re   c           
      C   s   t jd}|dk r(dt d|  }ndt d|  }d|tddf| < d	}||||j  }t |d
d}tj	||| d}t
||}t
||}	|	|ksJ d S )Nr   r   r[   )r   )r   皙?re      r   r   r   r   r   )r"   r#   r\   r}   slicer]   r%   r&   r   r   r   )
r   r   r7   r_   r*   r   r   r:   r   r   r+   r+   r,   test_wavelet_denoising_nd  s    		

r   c                   C   sD   t t& tjtdddd W d    n1 s60    Y  d S )Nr   ZUnimplementedTr   )r   r   r   r   r   r"   r}   r+   r+   r+   r,   test_wavelet_invalid_methodC  s    r   r   c                 C   s`  t jd}d}d}d}dt |f|  }d|tddf| < d	}||||j  }t |d
d}tj	||| d}tj	||d| d}	t
||}
t
||}t
||	}||  kr|
ksn J tt |jt|j}tdg& tj	|||d | d W d    n1 s0    Y  tt" tj	||d| d W d    n1 sR0    Y  d S )Nr   r      r   r[   r   re   r   r   r   r   )r   r   )r   r   r   z1all coefficients will experience boundary effectsr   )r"   r#   r\   r}   r   r]   r%   r&   r   r   r   pywtZdwt_max_levelrC   ZWaveletZdec_lenr	   r   r   r   )r   r_   r7   Nr   r*   r   r   r:   r   r   r   r   Z	max_levelr+   r+   r,   test_wavelet_denoising_levelsI  sH    




&r   c                  C   sL   t jd} t }d}||| |j 7 }tj|d d}t	||dd d S )Nr   r   r   r   decimal)
r"   r#   r\   r   r   r]   r%   r   r   r   )r_   r*   r   r   r+   r+   r,   test_estimate_sigma_grayt  s    r   c                  C   sn   t jd} t d}tddtddf}d||< d}|| || j ||< tj|d d}t	||dd	 d S )
Nr   )r   r   r   `   r   r   r   r   r   )
r"   r#   r\   rx   r   r]   r%   r   r   r   )r_   r*   Z
center_roir   r   r+   r+   r,    test_estimate_sigma_masked_image  s    
r   c                 C   s   t jd}t }d}||||j 7 }t |d| }tj	|| dd}t
||dd tj	|| dd}tt||j|   t
|d	 |dd | |j dkrtttj	| d S )
Nr   r   r   T)r.   Zaverage_sigmasr   r   Fr   )r"   r#   r\   r3   r   r]   r%   r4   r   r   r   r   lenr7   r   UserWarning)r.   r_   r*   r   r   Z
sigma_listr+   r+   r,   test_estimate_sigma_color  s     r   c              
   C   s   t }| dtj|j  }dD ]}dD ]}|r6dnd}|r|stt" t	j
|||| d W d   q*1 st0    Y  q*dg ddfD ]0}|s|rt|tr|sqt	j
||||| d qq*q"dS )z
    Some of the functions inside wavelet denoising throw an error the wrong
    arguments are passed. This protects against that and verifies that all
    arguments can be passed.
    r   )TFr   N)r   r.   r   )r   r   r   )r   r   r.   r   )r3   r   r"   r#   r]   r%   r   r   r   r   r   
isinstancelist)r   r*   r   r   Zmultichannelr.   r   r+   r+   r,   test_wavelet_denoising_args  s2    $r   c                 C   s   t }tttj|dd| d dS )zABiorthogonal wavelets should raise a warning during thresholding.zbior2.2N)r   r.   r   )r   r   r   r   r   )r   r*   r+   r+   r,   !test_denoise_wavelet_biorthogonal  s
    
r   c              
   C   s^  d}t jd}|d ur>t}g d}g d}g d}g d}n$t}g d}g d}d	d
g}g d}| d||j  }	tj	}
t
||| d}ttg4 tj|	|
d||d}|
|	fi |}W d    n1 s0    Y  t|| |D ]d}ttg$ tj|	|
|||d}W d    n1 s$0    Y  t||}t||}||ksJ q|D ]j}ttg& tj|	|
d|||d}W d    n1 s0    Y  t||}t||}||ksTJ qT|D ]F}tt$ tj|	|
|||d}W d    n1 s0    Y  q|D ]H}tt& tj|	|
d|||d}W d    n1 sL0    Y  qd S )Nr   r   )r   r   r   r   r   r   r   )r   r   r   )r   r   r   r   )r   r   r   )r   r   r   r   )r   r   r   r   )r  )r   r   r   r   r   r   r   )r   r   r   r   )r   r   r   r  r  )r  )r   r   r   r   r  r   r   )
max_shiftsfunc_kwr.   r   )r  shift_stepsr  r.   )r"   r#   r\   r3   r   r   r]   r%   r   r   r   r	   DASK_NOT_INSTALLED_WARNING
cycle_spinr   r   r   r   r   )r   r.   r   r_   r*   Zvalid_shiftsZvalid_stepsZinvalid_shiftsZinvalid_stepsr   denoise_funcr  Zdn_ccdnr  ZpsnrZpsnr_ccr  r+   r+   r,    test_cycle_spinning_multichannel  sz    

.
&

&

*r  c            
   	   C   s   t } d}tjd}|  d|| j  }tj}t	|ddd}tj
||d|d dd}tj
||d|dd}t|| ttg< tj
||d|d d	d}tj
||d|d d d}	W d    n1 s0    Y  t|| t||	 d S )
Nr   r   r   Tr   r   )r  r  r.   num_workers)r  r  r  r   )r   r"   r#   r\   r   r]   r%   r   r   r   r  r   r	   r  r   )
r*   r   r_   r   r	  r  Zdn_cc1Zdn_cc1_Zdn_cc2Zdn_cc3r+   r+   r,   test_cycle_spinning_num_workers  s2    




$
r  )fr5   	itertoolsnumpyr"   r   r   Znumpy.testingr   r   r   Zskimager   r   r   r   Zskimage._shared._warningsr	   Zskimage._shared.utilsr
   r   Zskimage.metricsr   r   Zskimage.restoration._denoiser   ZdaskImportErrorr  r#   seedr   r3   Zrgb2grayr   rA   rq   ri   Zgray2rgbZastro_gray_oddr   r   r   r^   Zfloat_dtypesZfloat128AttributeErrormarkZparametrizer-   r<   rE   rQ   rW   rX   rb   rn   rp   rr   rs   ru   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   productint16r@   r   r   r   r   r   r   r   r   r   r   r   r  r  r+   r+   r+   r,   <module>   s  









	
!&


,
G

*


H