U
    (d3                     @   s  d dl Z d dlmZmZmZmZmZmZmZ d dl	Z
d dlZd dlmZmZmZ d dlmZ zd dlZW n ek
r   dZY nX ddlmZ ejjeeddd	Zejjeee dd
dZejjeee dddZejjeedddZejjejejdddZejjejejdddZejjeje ejdddZ!ejjeje ejdddZ"ejjeje ejdddZ#ejjeje ejdddZ$ejjdPeje e ejd!d"d#Z%ejjdQejeeee eed%f f eee ee  ee d%f f  ed& ejd'd(d)Z&ejjejeeeeejd*d+d,Z'ejjej(dfejeee ef eee ejd-d.d/Z)ejjdReee ee  ee d%f f  eje*ee*eee ee  ee d%f f  f d1d2d3Z+ejjej,d fejee  eeee ee  ee d%f f  ejd4d5d6Z-ejjej,d7dd feje eeeeeef  eee ee  ee d%f f  ejd8d9d:Z.ejjej/d feje eeee ee  ee d%f f  ejd;d<d=Z0ejjejeejd>d?d@Z1ejjejejddAdBZ2ejjejeejdCdDdEZ3ejjejeejdFdGdHZ4ejjeje ejdIdJdKZ5ejjejejddLdMZ6ejjejejddNdOZ7dS )S    N)AnyDictListOptionalSequenceTupleUnion)ImageImageOpsImageEnhance)Literal   )_pil_constants)imgreturnc                 C   s*   t d k	rt| tjt jfS t| tjS d S N)accimage
isinstancer	   r    r   I/tmp/pip-unpacked-wheel-vx7f76es/torchvision/transforms/functional_pil.py_is_pil_image   s    r   c                 C   sP   t | r:t| dr t|  }n| j}| j\}}|||gS tdt|  d S NgetbandsUnexpected type )r   hasattrlenr   channelssize	TypeErrortype)r   r   widthheightr   r   r   get_dimensions   s    


r#   c                 C   s(   t | rt| jS tdt|  d S )Nr   )r   listr   r   r    r   r   r   r   get_image_size$   s    
r%   c                 C   s:   t | r$t| drt|  S | jS tdt|  d S r   )r   r   r   r   r   r   r    r   r   r   r   get_image_num_channels+   s
    
r&   c                 C   s&   t | stdt|  | tjS Nimg should be PIL Image. Got )r   r   r    	transposer   ZFLIP_LEFT_RIGHTr   r   r   r   hflip5   s    r*   c                 C   s&   t | stdt|  | tjS r'   )r   r   r    r)   r   ZFLIP_TOP_BOTTOMr   r   r   r   vflip=   s    r+   )r   brightness_factorr   c                 C   s2   t | stdt|  t| }||} | S r'   )r   r   r    r   Z
Brightnessenhance)r   r,   enhancerr   r   r   adjust_brightnessE   s
    

r/   )r   contrast_factorr   c                 C   s2   t | stdt|  t| }||} | S r'   )r   r   r    r   ZContrastr-   )r   r0   r.   r   r   r   adjust_contrastO   s
    

r1   )r   saturation_factorr   c                 C   s2   t | stdt|  t| }||} | S r'   )r   r   r    r   ZColorr-   )r   r2   r.   r   r   r   adjust_saturationY   s
    

r3   )r   
hue_factorr   c              	   C   s   d|  krdks&n t d| dt| s@tdt|  | j}|dkrR| S | d \}}}tj|tj	d}tj
d	d
 |t	|d 7 }W 5 Q R X t|d}td|||f|} | S )Ng      g      ?zhue_factor (z) is not in [-0.5, 0.5].r(   >   LFI1ZHSVZdtypeignore)Zover   r5   )
ValueErrorr   r   r    modeconvertsplitnparrayuint8Zerrstater	   	fromarraymerge)r   r4   
input_modehsvZnp_hr   r   r   
adjust_huec   s    rI         ?)r   gammagainr   c                    sn   t | stdt|  dk r*td| j}| d}  fddtdD d }| |} | |} | S )	Nr(   r   z*Gamma should be a non-negative real numberRGBc                    s&   g | ]}t d   t|d  qS )go@g     o@)intpow).0ZelerL   rK   r   r   
<listcomp>   s     z adjust_gamma.<locals>.<listcomp>      )r   r   r    r<   r=   r>   rangeZpoint)r   rK   rL   rE   Z	gamma_mapr   rQ   r   adjust_gamma{   s    


rV   constant.rW   ZedgeZreflectZ	symmetric)r   paddingfillpadding_moder   c                 C   s  t | stdt|  t|tjttfs4tdt|tjttfsNtdt|ts`tdt|trrt|}t|trt	|dkrt
dt	| dt|trt	|dkr|d	 }|d
krt
d|dkr0t|| dd}| jdkr|  }tj| fd|i|}|| |S tj| fd|i|S t|trL| } } }	}
t|tr~t	|dkr~|d	  }}|d  }	}
t|trt	|dkr|d	 }|d }	|d }|d }
||	||
g}t|d	 }| r|\}}}}| ||| j| | j| f} t|d	\}}	}}
| jdkrl|  }t| } tj| |	|
f||ff|d} t| } | | | S t| } t	| jdkrt| |	|
f||fdf|} t	| jdkrt| |	|
f||ff|} t| S d S )Nr(   zGot inappropriate padding argzGot inappropriate fill argz"Got inappropriate padding_mode arg)r         z<Padding must be an int or a 1, 2, or 4 element tuple, not a z element tupler   r   rX   zBPadding mode should be either constant, edge, reflect or symmetricrW   rZ   )namePZborderr\   r]   rT   )r=   )r   r   )r   r   r    r   numbersNumbertupler$   strr   r<   _parse_fillr=   Z
getpaletter
   expandZ
putpaletterN   r@   Zminimumanycropr!   r"   maximumZasarraypadr	   rC   shape)r   rY   rZ   r[   optsZpaletteimageZpad_leftZ	pad_rightZpad_topZ
pad_bottompZcroppingZ	crop_leftZcrop_topZ
crop_rightZcrop_bottomr   r   r   ri      sj    








ri   )r   topleftr"   r!   r   c                 C   s4   t | stdt|  | |||| || fS r'   )r   r   r    rg   )r   rn   ro   r"   r!   r   r   r   rg      s    	rg   )r   r   interpolationmax_sizer   c                 C   sb  t | stdt|  t|tsHt|tr:t|dksHtd| t|trft|dkrf|d }t|tr6| j\}}||kr||fn||f\}}|t|| |  }}	|d k	r||krtd| d| |	|krt|| |	 | }}	||kr||	fn|	|f\}
}||f|
|fkr$| S | 	|
|f|S n(|d k	rHtd| 	|d d d	 |S d S )
Nr(   )r   r\   zGot inappropriate size arg: r   r   zmax_size = zN must be strictly greater than the requested size for the smaller edge size = zmax_size should only be passed if size specifies the length of the smaller edge, i.e. size should be an int or a sequence of length 1 in torchscript mode.)
r   r   r    r   rN   r   r   r   r<   resize)r   r   rp   rq   wrF   shortlongZ	new_shortZnew_longZnew_wZnew_hr   r   r   rs      s4     

rs   	fillcolor)rZ   r   r^   r   c                 C   s   t | }| d krd} t| ttfr<|dkr<t| g| } t| ttfrvt | |krnd}t|t | |t| } |j	dkrt| ttfrtdd | D } nt| } || iS )Nr   r   z[The number of elements in 'fill' does not match the number of bands of the image ({} != {})r6   c                 s   s   | ]}t |V  qd S r   )rN   )rP   xr   r   r   	<genexpr>3  s     z_parse_fill.<locals>.<genexpr>)
r   r   r   rN   floatrb   r$   r<   formatr=   )rZ   r   r^   Z	num_bandsmsgr   r   r   rd     s    
rd   )r   matrixrp   rZ   r   c                 C   s@   t | stdt|  | j}t|| }| j|tj||f|S r'   )r   r   r    r   rd   	transformr   ZAFFINE)r   r}   rp   rZ   Zoutput_sizerk   r   r   r   affine:  s
    
r   F)r   anglerp   re   centerrZ   r   c                 C   s8   t | stdt|  t|| }| j||||f|S r'   )r   r   r    rd   rotate)r   r   rp   re   r   rZ   rk   r   r   r   r   J  s    

r   )r   perspective_coeffsrp   rZ   r   c                 C   s<   t | stdt|  t|| }| j| jtj||f|S r'   )r   r   r    rd   r~   r   r   ZPERSPECTIVE)r   r   rp   rZ   rk   r   r   r   perspective[  s    
r   )r   num_output_channelsr   c                 C   sz   t | stdt|  |dkr.| d} nH|dkrn| d} tj| tjd}t|||g}t	|d} nt
d| S )Nr(   r   r5   rT   r9   rM   z+num_output_channels should be either 1 or 3)r   r   r    r>   r@   rA   rB   Zdstackr	   rC   r<   )r   r   Znp_imgr   r   r   to_grayscalek  s    
r   c                 C   s$   t | stdt|  t| S r'   )r   r   r    r
   invertr   r   r   r   r   }  s    r   )r   bitsr   c                 C   s&   t | stdt|  t| |S r'   )r   r   r    r
   	posterize)r   r   r   r   r   r     s    r   )r   	thresholdr   c                 C   s&   t | stdt|  t| |S r'   )r   r   r    r
   solarize)r   r   r   r   r   r     s    r   )r   sharpness_factorr   c                 C   s2   t | stdt|  t| }||} | S r'   )r   r   r    r   Z	Sharpnessr-   )r   r   r.   r   r   r   adjust_sharpness  s
    

r   c                 C   s$   t | stdt|  t| S r'   )r   r   r    r
   autocontrastr   r   r   r   r     s    r   c                 C   s$   t | stdt|  t| S r'   )r   r   r    r
   equalizer   r   r   r   r     s    r   )rJ   )r   rW   )rw   )8r`   typingr   r   r   r   r   r   r   Znumpyr@   ZtorchZPILr	   r
   r   Ztyping_extensionsr   r   ImportError r   ZjitZunusedboolr   rN   r#   r%   r&   r*   r+   rz   r/   r1   r3   rI   rV   ri   rg   ZBILINEARrs   rc   rd   ZNEARESTr   r   ZBICUBICr   r   r   r   r   r   r   r   r   r   r   r   <module>   s   $
				   O, $	