a
    d
                     @   sN   d dl Z d dlZd dlZd dlmZ dd Zddd	ZG d
d dej	j
ZdS )    N)
functionalc           	      C   s  | d}|   \}}}}|d dkrPtj| |d |d |d |d fdd} ntd|   dd \}}| d	dkr| || d||} |dd||}tj| |d	d
||||S | d|| ||} ||d||d|dd|| d||}tj| ||| d||||S dS )zuPyTorch version of cv2.filter2D

    Args:
        img (Tensor): (b, c, h, w)
        kernel (Tensor): (b, k, k)
          Zreflect)modezWrong kernel sizeNr   )padding)groups)sizeFpad
ValueErrorviewZconv2drepeat)	imgkernelkbchwphpw r   g/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/utils/img_process_util.pyfilter2D   s    
*,r         ?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.

    Input image: I; Blurry image: B.
    1. sharp = I + weight * (I - B)
    2. Mask = 1 if abs(I - B) > threshold, else: 0
    3. Blur mask:
    4. Out = Mask * sharp + (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      float32)cv2ZGaussianBlurnpabsZastypeclip)	r   weightradius	thresholdblurresidualmask	soft_masksharpr   r   r   	usm_sharp"   s    
r-   c                       s(   e Zd Zd	 fdd	Zd
ddZ  ZS )USMSharpr   r   c                    s`   t t|   |d dkr"|d7 }|| _t||}tt	||
 d}| d| d S )Nr   r   r   r   )superr.   __init__r&   r!   ZgetGaussianKerneltorchZFloatTensorr"   dotZ	transposeZ
unsqueeze_Zregister_buffer)selfr&   sigmar   	__class__r   r   r0   A   s    zUSMSharp.__init__r   r   c           	      C   sh   t || j}|| }t|d |k}| }t || j}|||  }t|dd}|| d| |  S )Nr   r   r   )r   r   r1   r#   floatr$   )	r3   r   r%   r'   r(   r)   r*   r+   r,   r   r   r   forwardJ   s    zUSMSharp.forward)r   r   )r   r   )__name__
__module____qualname__r0   r8   __classcell__r   r   r5   r   r.   ?   s   	r.   )r   r   r   )r!   numpyr"   r1   Ztorch.nnr   r   r   r-   nnModuler.   r   r   r   r   <module>   s   
