o
    Zh$                     @   s   d Z ddlmZmZ ddlZddlmZmZ ddl	m
Z
mZmZ ddlmZmZmZmZmZmZmZmZ ddlmZmZmZ eeZG d	d
 d
eZd
gZdS )z"Image processor class for Swin2SR.    )OptionalUnionN   )BaseImageProcessorBatchFeature)get_image_sizepadto_channel_dimension_format)ChannelDimension
ImageInputinfer_channel_dimension_formatis_scaled_imagemake_list_of_imagesto_numpy_arrayvalid_imagesvalidate_preprocess_arguments)
TensorTypefilter_out_non_signature_kwargsloggingc                       s   e Zd ZdZdgZ				ddedeeef ded	ed
df
 fddZ			dde
jdedeeeef  deeeef  fddZe dddddejdfdedee dee dee d	ee deeeef  deeef deeeef  fddZ  ZS )Swin2SRImageProcessora  
    Constructs a Swin2SR image processor.

    Args:
        do_rescale (`bool`, *optional*, defaults to `True`):
            Whether to rescale the image by the specified scale `rescale_factor`. Can be overridden by the `do_rescale`
            parameter in the `preprocess` method.
        rescale_factor (`int` or `float`, *optional*, defaults to `1/255`):
            Scale factor to use if rescaling the image. Can be overridden by the `rescale_factor` parameter in the
            `preprocess` method.
    pixel_valuesTp?   
do_rescalerescale_factordo_padpad_sizereturnNc                    s.   t  jdi | || _|| _|| _|| _d S )N )super__init__r   r   r   r   )selfr   r   r   r   kwargs	__class__r   c/var/www/auris/lib/python3.10/site-packages/transformers/models/swin2sr/image_processing_swin2sr.pyr    6   s
   
zSwin2SRImageProcessor.__init__imagesizedata_formatinput_data_formatc           	      C   sT   t ||\}}|| d | | }|| d | | }t|d|fd|ffd||dS )a  
        Pad an image to make the height and width divisible by `size`.

        Args:
            image (`np.ndarray`):
                Image to pad.
            size (`int`):
                The size to make the height and width divisible by.
            data_format (`str` or `ChannelDimension`, *optional*):
                The channel dimension format for the output image. If unset, the channel dimension format of the input
                image is used. Can be one of:
                - `"channels_first"` or `ChannelDimension.FIRST`: image in (num_channels, height, width) format.
                - `"channels_last"` or `ChannelDimension.LAST`: image in (height, width, num_channels) format.
            input_data_format (`str` or `ChannelDimension`, *optional*):
                The channel dimension format for the input image. If unset, the channel dimension format is inferred
                from the input image. Can be one of:
                - `"channels_first"` or `ChannelDimension.FIRST`: image in (num_channels, height, width) format.
                - `"channels_last"` or `ChannelDimension.LAST`: image in (height, width, num_channels) format.

        Returns:
            `np.ndarray`: The padded image.
           r   Z	symmetric)moder(   r)   )r   r   )	r!   r&   r'   r(   r)   Z
old_heightZ	old_widthZ
pad_heightZ	pad_widthr   r   r%   r   E   s   zSwin2SRImageProcessor.padimagesreturn_tensorsc	           
         s  |dur|nj }durnj|dur|nj}dur!njt|}t|s0tdt||d dd |D }|rLt|d rLt	
d du rVt|d |rcfdd|D }|rpfd	d|D } fd
d|D }d|i}	t|	|dS )a 
  
        Preprocess an image or batch of images.

        Args:
            images (`ImageInput`):
                Image to preprocess. Expects a single or batch of images with pixel values ranging from 0 to 255. If
                passing in images with pixel values between 0 and 1, set `do_rescale=False`.
            do_rescale (`bool`, *optional*, defaults to `self.do_rescale`):
                Whether to rescale the image values between [0 - 1].
            rescale_factor (`float`, *optional*, defaults to `self.rescale_factor`):
                Rescale factor to rescale the image by if `do_rescale` is set to `True`.
            do_pad (`bool`, *optional*, defaults to `True`):
                Whether to pad the image to make the height and width divisible by `window_size`.
            pad_size (`int`, *optional*, defaults to 32):
                The size of the sliding window for the local attention.
            return_tensors (`str` or `TensorType`, *optional*):
                The type of tensors to return. Can be one of:
                - Unset: Return a list of `np.ndarray`.
                - `TensorType.TENSORFLOW` or `'tf'`: Return a batch of typ, input_data_format=input_data_formate
                  `tf.Tensor`.
                - `TensorType.PYTORCH` or `'pt'`: Return a batch of type `torch.Tensor`.
                - `TensorType.NUMPY` or `'np'`: Return a batch of type `np.ndarray`.
                - `TensorType.JAX` or `'jax'`: Return a batch of type `jax.numpy.ndarray`.
            data_format (`ChannelDimension` or `str`, *optional*, defaults to `ChannelDimension.FIRST`):
                The channel dimension format for the output image. Can be one of:
                - `"channels_first"` or `ChannelDimension.FIRST`: image in (num_channels, height, width) format.
                - `"channels_last"` or `ChannelDimension.LAST`: image in (height, width, num_channels) format.
                - Unset: Use the channel dimension format of the input image.
            input_data_format (`ChannelDimension` or `str`, *optional*):
                The channel dimension format for the input image. If unset, the channel dimension format is inferred
                from the input image. Can be one of:
                - `"channels_first"` or `ChannelDimension.FIRST`: image in (num_channels, height, width) format.
                - `"channels_last"` or `ChannelDimension.LAST`: image in (height, width, num_channels) format.
                - `"none"` or `ChannelDimension.NONE`: image in (height, width) format.
        NzkInvalid image type. Must be of type PIL.Image.Image, numpy.ndarray, torch.Tensor, tf.Tensor or jax.ndarray.)r   r   r   Zsize_divisibilityc                 S   s   g | ]}t |qS r   )r   .0r&   r   r   r%   
<listcomp>   s    z4Swin2SRImageProcessor.preprocess.<locals>.<listcomp>r   zIt looks like you are trying to rescale already rescaled images. If the input images have pixel values between 0 and 1, set `do_rescale=False` to avoid rescaling them again.c                       g | ]
}j | d qS ))r&   scaler)   )Zrescaler.   )r)   r   r!   r   r%   r0      s    c                    r1   ))r'   r)   )r   r.   )r)   r   r!   r   r%   r0      s    c                    s   g | ]	}t | d qS ))Zinput_channel_dim)r	   r.   )r(   r)   r   r%   r0      s    r   )dataZtensor_type)r   r   r   r   r   r   
ValueErrorr   r   loggerZwarning_oncer   r   )
r!   r,   r   r   r   r   r-   r(   r)   r3   r   )r(   r)   r   r   r!   r%   
preprocessn   sB   /z Swin2SRImageProcessor.preprocess)Tr   Tr   )NN)__name__
__module____qualname____doc__Zmodel_input_namesboolr   intfloatr    npZndarrayr   strr
   r   r   ZFIRSTr   r   r6   __classcell__r   r   r#   r%   r   '   sl    

)
	r   )r:   typingr   r   numpyr>   Zimage_processing_utilsr   r   Zimage_transformsr   r   r	   Zimage_utilsr
   r   r   r   r   r   r   r   utilsr   r   r   Z
get_loggerr7   r5   r   __all__r   r   r   r%   <module>   s   (

 
(