o
    *j                     @   s.  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlm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ejd< d	d
gZdhddZdd Zdd Zdd Zdd ZdiddZdd ZdiddZdd Zdjdd Zdjd!d"Zd#d$ Zd%d& Zd'd( Z did)d*Z!did+d,Z"d-d. Z#d/d0 Z$d1ej%d2d2fd3d4Z&dkd5d6Z'did7d8Z(d9d: Z)e*d1d1ge*d;d;gd<d=d fd>d?Z+d@dA Z,dBdC Z-dDdE Z.dhdFdGZ/dhdHdIZ0dhdJdKZ1dhdLdMZ2dldQdRZ3dmdSdTZ4dmdUdVZ5dndYdZZ6dnd[d\Z7d]d^ Z8d_d` Z9dodbdcZ:dpddd	Z;dmdedfZ<dpdgd
Z=dS )q    N)datetime)ndimage)interp2d)orth)	make_gridTRUEZKMP_DUPLICATE_LIB_OKdegradation_bsrgan_lightdegradation_bsrgan   c                 C   sj   |dkrt | d}tj|dd}|S |dkr3t | t j}|jdkr,t |t j}|S t |t j}|S )N   r      Zaxisr
   )	cv2Zimreadnpexpand_dimsZIMREAD_UNCHANGEDndimcvtColorZCOLOR_GRAY2RGBCOLOR_BGR2RGB)pathZ
n_channelsimg r   z/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/multi_modal/videocomposer/ops/degration.pyimread_uint   s   
r   c                 C      t | d S )N     o@r   float32r   r   r   r   uint2single&      r   c                 C      t | ddd  S )Nr   r   r   )r   uint8cliproundr   r   r   r   single2uint*      r$   c                 C   r   )N    @r   r   r   r   r   uint162single.   r   r'   c                 C   r    )Nr   r   r&   )r   Zuint16r"   r#   r   r   r   r   single2uint162   r%   r(   Tc                 C      | j }| tj |tjkr| d9 } |r!t| g dd d }nt| g dg dg dgd g d }|tjkr@| }n|d }||S )zxsame as matlab rgb2ycbcr
    only_y: only return Y channel
    Input:
        uint8, [0, 255]
        float, [0, 1]
    r   )X9^P@V-`@K8@      0@r*   gtB      \@r+   gERgMrWr,   r/   gX962      r4   dtypeastyper   r   r!   dotmatmulr#   r   only_yin_img_typerltr   r   r   	rgb2ycbcr6   &   



r>   c                 C   st   | j }| tj |tjkr| d9 } t| g dg dg dgd g d }|tjkr1| }n|d }||S )zVsame as matlab ycbcr2rgb
    Input:
        uint8, [0, 255]
        float, [0, 1]
    r   )oݩr?r@   r@   )r   g]	+Yg}3?)gy?gN jr   )gxkgOn`@gL7A`Mq)r6   r7   r   r   r!   r9   r#   )r   r<   r=   r   r   r   	ycbcr2rgbO   s    



rA   c                 C   r)   )zxbgr version of rgb2ycbcr
    only_y: only return Y channel
    Input:
        uint8, [0, 255]
        float, [0, 1]
    r   )r,   r+   r*   r-   r1   r0   r.   r2   r5   r:   r   r   r   	bgr2ycbcrf   r?   rB   c                 C   sz   | dkr|dkrdd |D }dd |D S | dkr,|dkr,dd |D }dd |D S | d	kr;|d
kr;dd |D S |S )Nr
   grayc                 S      g | ]	}t |t jqS r   )r   r   ZCOLOR_BGR2GRAY.0r   r   r   r   
<listcomp>       z#channel_convert.<locals>.<listcomp>c                 S      g | ]	}t j|d dqS r   r   r   r   rE   r   r   r   rG      rH   yc                 S   s   g | ]}t |d dqS )T)r;   )rB   rE   r   r   r   rG      s    c                 S   rI   rJ   rK   rE   r   r   r   rG      rH   r   RGBc                 S   rD   r   )r   r   ZCOLOR_GRAY2BGRrE   r   r   r   rG      rH   r   )Zin_cZtar_typeZimg_listZ	gray_listZy_listr   r   r   channel_convert   s   rN   c                 C   s   | j |j ks
td| j d d \}}| ||| ||| f } |||| ||| f }| tj} |tj}t| | d }|dkrLtdS dtdt	|  S )N+Input images must have the same dimensions.r   r   inf   r   )
shape
ValueErrorr7   r   float64meanfloatmathlog10sqrt)img1img2borderhwZmser   r   r   calculate_psnr   s   r_   c              	   C   s  | j |j ks
td| j dd \}}| ||| ||| f } |||| ||| f }| jdkr9t| |S | jdkr| j d dkrog }tdD ]}|t| dddd|f |dddd|f  qKt| S | j d dkrtt	| t	|S dS td)zMcalculate SSIM
    the same outputs as MATLAB's
    img1, img2: [0, 255]
    rO   Nr   r
   r   zWrong input image dimensions.)
rR   rS   r   ssimrangeappendr   arrayrU   squeeze)rZ   r[   r\   r]   r^   Zssimsir   r   r   calculate_ssim   s"   


6rf   c                 C   s:  d}d}|  tj} | tj}tdd}t|| }t| d|ddddf }t|d|ddddf }|d }|d }	|| }
t| d d|ddddf | }t|d d|ddddf |	 }t| | d|ddddf |
 }d|
 | d| |  ||	 | || |   }| S )	Ng(\@gzGBM@         ?   r   )	r7   r   rT   r   ZgetGaussianKernelouter	transposeZfilter2DrU   )rZ   r[   ZC1ZC2kernelZwindowZmu1Zmu2Zmu1_sqZmu2_sqZmu1_mu2Z	sigma1_sqZ	sigma2_sqZsigma12Zssim_mapr   r   r   r`      s,   &&&



r`   c                 C   sn   t | }|d }|d }d| d|  d |dk| d| d|  d|  d |dk|dk |  S )Nr   r
   rh   g      @r            )torchabsZtype_as)xZabsxZabsx2Zabsx3r   r   r   cubic   s   
 0rt   c                 C   s  |dk r
|r
|| }t d||}|| ddd|    }t ||d  }t|d }	||d||	t d|	d |	d|	||	 }
||d||	|
 }|dk rc|rc|t||  }nt|}t |d|d}||||	 }t |dkd}tj	|d ddds|

dd|	d }
|
dd|	d }tj	|d ddds|

dd|	d }
|
dd|	d }| }|
 }
|
  d }|
 |  }|
| d }
||
t|t|fS )Nr         ?r   r   gư>)Zrel_tolri   )rq   ZlinspacefloorrW   ceilviewexpandrt   sumisclosenarrow
contiguousminmaxint)Z	in_lengthZ
out_lengthscalern   kernel_widthantialiasingrs   uleftPindicesZdistance_to_centerweightsZweights_sumZweights_zero_tmpZ	sym_len_sZ	sym_len_er   r   r   calculate_weights_indices   s<   
r   c                 C   sR  |   dkrdnd}|r| d |  \}}}|t|| t|| }}}	d}
d}t|||||
|\}}}}t||	|||
|\}}}}t||| | |}|d||	|  | d d d |d d f }t
|dd dd }|d|}|dd|	| | d d | d d d f }t
|dd dd }|d|}|d|| |	| t|||}|d}
t|D ].}t|| d }t|D ]}|||||
 d d f dd|| |||d d f< qqt|||| | }|d||	| |d d d d d |f }t
|dd dd }|d|}|dd|	| |d d d d | d f }t
|dd dd }|d|}|d|| |	| t|||	}|d}
t|	D ],}t|| d }t|D ]}||d d |||
 f || ||d d |f< qqs|r|  |S )	Nr   TFr   rp   rt   r   ri   )dim
unsqueeze_sizerW   rw   r   rq   FloatTensorr|   copy_arangelongindex_selectra   r   rm   mvsqueeze_)r   r   r   need_squeezein_Cin_Hin_Wout_Cout_Hout_Wr   rn   	weights_H	indices_H
sym_len_Hs
sym_len_He	weights_W	indices_W
sym_len_Ws
sym_len_Weimg_aug	sym_patchinv_idxsym_patch_invout_1re   idxj	out_1_augout_2r   r   r   imresize  sx   






r   c                 C   s`  t | } |  dkrdnd}|r| d |  \}}}|t|| t|| }}}	d}
d}t|||||
|\}}}}t||	|||
|\}}}}t || | ||}|	d||
|  | d |d d d d f }t |dd dd }|d|}|	dd|
| | | d d d d d f }t |dd dd }|d|}|	d|| |
| t |||}|d}
t|D ].}t|| d }t|D ]}||||
 d d |f dd|| ||d d |f< qqt ||| | |}|	d||
| |d d d |d d f }t |dd dd }|d|}|	dd|
| |d d | d d d f }t |dd dd }|d|}|	d|| |
| t ||	|}|d}
t|	D ],}t|| d }t|D ]}|d d |||
 |f || |d d ||f< qqx|r|  | S )	Nr   TFrp   rt   r   r   ri   )rq   Z
from_numpyr   r   r   rW   rw   r   r   r|   r   r   r   r   ra   r   rm   r   r   numpy)r   r   r   r   r   r   r   r   r   r   r   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   re   r   r   r   r   r   r   r   imresize_np]  sz   




r   c                 C   sB   | j dd \}}t| }|d|||  d|||  df S )zq
    Args:
        img: numpy image, WxH or WxHxC
        sf: scale factor
    Return:
        cropped image
    Nr   .)rR   r   copy)r   sfr^   r]   Zimr   r   r   
modcrop_np  s   
&r   c                 C   s   | j d }td| d d| d f}t|D ])}t|D ]"}|d| d| | d| d| | f  | ||f |  7  < qq|d }||| || f }||  S )zLCalculate the X4 kernel from the X2 kernel (for proof see appendix in paper)r   r
   r   )rR   r   zerosra   rz   )kk_sizeZbig_krccropZcropped_big_kr   r   r   analytic_kernel  s   
Br         c           	   	   C   s   t t t |t | gt |t |ggt ddg}t |d |d g|d |d  gg}t |dgd|gg}t t ||t j|}tddg|| d}|S )aM   generate an anisotropic Gaussian kernel
    Args:
        ksize : e.g., 15, kernel size
        theta : [0,  pi], rotation angle range
        l1    : [0.1,50], scaling of eigenvalues
        l2    : [0.1,l1], scaling of eigenvalues
        If l1 = l2, will get an isotropic Gaussian kernel.
    Returns:
        k     : kernel
          ?        r   r   )rU   covr   )r   r8   rc   cossinlinalginvgm_blur_kernel)	ksizethetal1l2vVDSigmar   r   r   r   anisotropic_Gaussian  s   (r   c           	      C   s~   |d d }t ||g}t|D ]$}t|D ]}|| d }|| d }tjj||g| |d|||f< qq|t | }|S )N       @ru   r   )rU   r   )r   r   ra   statsmultivariate_normalZpdfrz   )	rU   r   r   centerr   rL   rs   cyZcxr   r   r   r     s   r   c                 C   s   | j dd \}}|d d }td|dtd|d}}|r)|| }|| }	n|| }|| }	t|d|d }t|	d|d }	| jdkrQt||| ||	} | jdkr{t| j d D ]}
t||| dddd|
f ||	| dddd|
f< q]| S )	zshift pixel for super-resolution with different scale factors
    Args:
        x: WxHxC or WxH
        sf: scale factor
        upper_left: shift direction
    Nr   r   ru   r   r   r
   ri   )rR   r   r   r"   r   r   ra   )rs   r   Z
upper_leftr]   r^   shiftZxvZyvx1y1re   r   r   r   shift_pixel  s    


8r   c                 C   s   | j dd \}}|j d d d |j d d d }}tjjj| ||||fdd} |d|dd}|dd|j d |j d }| dd| j d | j d } tjjj| |ddd	|| d
} | ||| j d | j d } | S )z2
    x: image, NxcxHxW
    k: kernel, Nx1xhxw
    Nr   r   ri   Z	replicate)padmoder
   r   )ZbiasZstridepaddinggroups)rR   rq   nnZ
functionalr   repeatrx   Zconv2d)rs   r   nr   p1Zp2r   r   r   blur  s   &r   rp   333333?g      $@c                 C   s  |t j ||   }|t j ||   }t j t j }| t jj|  | d  }t ||g}	t t |t | gt |t |gg}
|
|	 |
j }t j	
|ddddddf }| d d|d   }|dddddf }t t| d t| d \}}t ||gddddddddf }|| }|dddd}t dt || |  d|  }|t | }|S )z"
    # modified version of https://github.com/assafshocher/BlindSR_dataset_generator
    # Kai Zhang
    # min_var = 0.175 * sf  # variance of the gaussian kernel will be sampled between min_var and max_var
    # max_var = 2.5 * sf
    r   Nru   r   r   r
   ro   )r   randomrandpidiagrc   r   r   Tr   r   meshgridra   stackrm   exprd   rz   )r   Zscale_factorZmin_varZmax_varnoise_levelZlambda_1Zlambda_2r   noiseZLAMBDAQZSIGMAZ	INV_SIGMAZMUXYZZZZZZZ_tZ
raw_kernelrn   r   r   r   
gen_kernel  s&     ($r   c           	      C   s   | | g} | d d d | d d d g}|}t t |d  |d d t |d  |d d \}}|| ||   d| |  }t |}d||ttj|  k < |	 }|dkrb|| }|S )Nr   r   r   r   r   )
r   r   r   r   scipyZfinforV   epsr   rz   )	ZhsizesigmaZsizZstdrs   rL   argr]   Zsumhr   r   r   fspecial_gaussianI  s    0
r   c                 C   sb   t dt| dgg} | | d  }d|  | d  }|||g|d| d  |g|||gg}t|}|S )Nr   r   )r   r~   r   rc   )alphah1h2r]   r   r   r   fspecial_laplacianX  s   $
r   c                 O   s0   | dkrt |i |S | dkrt|i |S d S )NgaussianZ	laplacian)r   r   )Zfilter_typeargskwargsr   r   r   fspeciala  s
   r   c                 C   s   t | d| d} | S )z
    Args:
        x: HxWxC image, [0, 1]
        sf: down-scale factor
    Return:
        bicubicly downsampled LR image
    r   )r   )r   )rs   r   r   r   r   bicubic_degradationh  s   r   c                 C   s,   t jj| tj|dddd} t| |d} | S )a   blur + bicubic downsampling
    Args:
        x: HxWxC image, [0, 1]
        k: hxw, double
        sf: down-scale factor
    Return:
        downsampled LR image
    Reference:
        @inproceedings{zhang2018learning,
          title={Learning a single convolutional super-resolution network for multiple degradations},
          author={Zhang, Kai and Zuo, Wangmeng and Zhang, Lei},
          booktitle={IEEE Conference on Computer Vision and Pattern Recognition},
          pages={3262--3271},
          year={2018}
        }
    r   r   wrapr   r   )r   filtersconvolver   r   r   rs   r   r   r   r   r   srmd_degradationt  s   r  c                 C   s,   t | |d} tjj| tj|dddd} | S )a   bicubic downsampling + blur
    Args:
        x: HxWxC image, [0, 1]
        k: hxw, double
        sf: down-scale factor
    Return:
        downsampled LR image
    Reference:
        @inproceedings{zhang2019deep,
          title={Deep Plug-and-Play Super-Resolution for Arbitrary Blur Kernels},
          author={Zhang, Kai and Zuo, Wangmeng and Zhang, Lei},
          booktitle={IEEE Conference on Computer Vision and Pattern Recognition},
          pages={1671--1681},
          year={2019}
        }
    r   r   r   r   r   )r   r   r  r  r   r   r  r   r   r   dpsr_degradation  s   r  c                 C   s:   t jj| tj|dddd} d}| |d||d|df S )z blur + downsampling
    Args:
        x: HxWxC image, [0, 1]/[0, 255]
        k: hxw, double
        sf: down-scale factor
    Return:
        downsampled LR image
    r   r   r   r   r   N.)r   r  r  r   r   )rs   r   r   str   r   r   classical_degradation  s   	r  ru   2   
   c           	      C   s   |d dkr
|d7 }t | ||fd}| | }t|d |k}|d}t |||fd}| ||  }t|dd}|| d| |   S )a  USM sharpening. borrowed from real-ESRGAN
    Input image: I; Blurry image: B.
    1. K = I + weight * (I - B)
    2. Mask = 1 if abs(I - B) > threshold, else: 0
    3. Blur mask:
    4. Out = Mask * K + (1 - Mask) * I
    Args:
        img (Numpy array): Input image, HWC, BGR; float32, [0, 1].
        weight (float): Sharp weight. Default: 1.
        radius (float): Kernel size of Gaussian blur. Default: 50.
        threshold (int):
    r   r   r      r   )r   ZGaussianBlurr   rr   r7   r"   )	r   weightZradius	thresholdr   ZresidualmaskZ	soft_maskKr   r   r   add_sharpening  s   
r  c                 C   s   d| }dd|  }|d }|d }t   dk r8|t    }|t    }tt ddd t   tj ||d	}ntd
t ddd |t    }tjj| tj	|dddd} | S )N      @r   皙?rp   ru   r   rg   r
   r   r   r   r   r   r   mirrorr   
r   r   randintr   r   r   r   r  r  r   r   r   Zwd2wdr   r   r   r   r   r   
add_blur_1  s(   r  c                 C   s   t j }|dkrtdd}n|dk rtd| d}nd}tj| t|| jd  t|| jd  ftg dd	} t 	| d
d} | S )N皙?r   r   gffffff?ru   r   r   r   r   r
   interpolationr   )
r   r   r   uniformr   resizer   rR   choicer"   )r   r   rnumsf1r   r   r   
add_resize  s   
$r"  r      c           	   	   C   s  t ||}tj  }|dkr!| tj d|d | jtj } n^|dk r@| tj d|d g | jd d dR tj } n?|d }ttj d}t	tj dd}t
t
t|||}| tj g dt|d | | jd d tj } t| d	d
} | S )Nr   r   r   皙?r   r   r
   r   r   r   r   r   )r   r  r   r   normalrR   r7   r   r   r   r8   rm   r   rr   r"   	r   noise_level1noise_level2r   r   Lr   Uconvr   r   r   add_Gaussian_noise  s2   

r-  c           	   
   C   s(  t ||}t| dd} t   }|dkr)| | tj d|d | jtj 7 } nb|dk rJ| | tj d|d g | jd d dR tj 7 } nA|d }ttj 	d	}t
tj 	d	d	}ttt|||}| | tj g d
t|d | | jd d tj 7 } t| dd} | S )Nr   r   r   r   r   r$  r   r   r
   r%  )r   r  r   r"   r&  rR   r7   r   r   r   r   r8   rm   r   rr   r'  r   r   r   add_speckle_noise  s4   
"r.  c                 C   s   t | d  ddd } ddt  d  }t dk r,t j| | t j| } n9t | dd d	f g d
}t |d  ddd }t j|| t j| | }| |d d d d t jf 7 } t | dd} | S )Nr   r   r
  r	  r   r   ru   .r
   )gA`"?gbX9?gv/?r   r   )	r   r"   r#   r   Zpoissonr7   r   r8   Znewaxis)r   valsZimg_grayZ
noise_grayr   r   r   add_Poisson_noise  s    r0  c                 C   s\   t dd}tt| tj} td| ttj|g\}}t	|d} tt
| tj} | S )NP   _   z.jpgr   )r   r  r   r   r$   ZCOLOR_RGB2BGRZimencoder   ZIMWRITE_JPEG_QUALITYZimdecoder   r   )r   Zquality_factorresultZencimgr   r   r   add_JPEG_noise(  s   r4  @   c           
      C   s   | j d d \}}td|| }td|| }| ||| ||| d d f } t|| t|| }}	|||||  |	|	||  d d f }| |fS )Nr   r   )rR   r   r  r   )
ZlqZhqr   Zlq_patchsizer]   r^   Zrnd_hZrnd_wZrnd_h_HZrnd_w_Hr   r   r   random_crop2  s   "r6  c              	   C   s  t | } d\}}}| jdd \}}|  d|||  d|||  df } | jdd \}}	|dkrnt |k rntj dk r_tj| td| jd  td| jd  ft	g d	d
} nt
| dd} t| dd} d}ttdd}
|
d|
d}}||kr|
| |
| |
|< |
|< |
D ]}|dkrt| |d} q|dkr| jd | jd }}t dk rtdd| }tj| td| | jd  td| | jd  ft	g d	d
} n2tddtdd| }t||}||  }tjj| tj|dddd} | dd|dd|df } t| dd} q|dkrCtj| td| | td| | ft	g d	d
} t| dd} q|dkrPt| ddd} q|dkr`t |k r`t| } qt| } t| } | S )  
    This is the variant of the degradation model of BSRGAN from the paper
    "Designing a Practical Degradation Model for Deep Blind Image Super-Resolution"
    sf: scale factor
    isp_model: camera ISP model
    Returns
    img: low-quality patch, size: lq_patchsizeXlq_patchsizeXC, range: [0, 1]
    hq: corresponding high-quality patch, size: (lq_patchsizexsf)X(lq_patchsizexsf)XC, range: [0, 1]
          ?g?r9  Nr   .rp   ru   r   r   r  r  Tr   r      r
   r   r  r   r#  皙?r   r   r  r   r(  r)  rj   )r   rR   r   r   r   r   r   r  r   r  r   r"   samplera   indexr  r  r   r   rz   r   r  r  r   r-  r4  r$   imager   Z	isp_model_Z	jpeg_probZscale2_probr   Zw1r]   r^   Zshuffle_orderZidx1Zidx2re   abr!  r   Z	k_shiftedr   r   r   r   >  sv   

*"


 

c                 C   s   d| }dd|  }t   dk r2|t    }|t    }tdt dd d t   tj ||d}ntd	dt dd d |t    }tjj| tj	|dd
dd} | S )Nr  r   r  ru   r   rg   r
   r  r   r   r  r   r  r  r   r   r   
add_blur_2  s$   
rD  c              	   C   s  t | } d\}}}| jdd \}}|  d|||  d|||  df } | jdd \}}	|dkrnt |k rntj dk r_tj| td| jd  td| jd  ft	g d	d
} nt
| dd} t| dd} d}ttdd}
|
d|
d}}||kr|
| |
| |
|< |
|< |
D ]}|dkrt| |d} q|dkrt| |d} q|dkr&| jd | jd }}t dk rtdd| }tj| td| | jd  td| | jd  ft	g d	d
} n2tddtdd| }t||}||  }tjj| tj|dddd} | dd|dd|df } t| dd} q|dkrNtj| td| | td| | ft	g d	d
} t| dd} q|dkr[t| ddd} q|dkrkt |k rkt| } qt| } t| } | S )r7  r8  Nr   .rp   ru   r   r   r  r  Tr   r   r:  r
   r   g      ?r   r#  r;  r   r   r  r   r<  rj   )r   rR   r   r   r   r   r   r  r   r  r   r"   r=  ra   r>  rD  r  r   r   rz   r   r  r  r   r-  r4  r$   r?  r   r   r   r	     sz   

*"


 

)r
   )T)r   )r   )ru   r  r	  )rp   )r   r#  )rp   r5  )rp   N)>rW   osr   r   r   r   r   Zscipy.statsr   rq   r   Zscipy.interpolater   Zscipy.linalgr   Ztorchvision.utilsr   environ__all__r   r   r$   r'   r(   r>   rA   rB   rN   r_   rf   r`   rt   r   r   r   r   r   r   r   r   r   r   rc   r   r   r   r   r   r  r  r  r  r  r"  r-  r.  r0  r4  r6  r   rD  r	   r   r   r   r   <module>   sx   






9
JL


/	












K