
    Ph                     .   d dl Z d dlmZmZmZmZ d dlZd dlmZ d dlm	Z	m
Z
mZmZ dedefdZdeddfd	Zdedee   fd
Zdedee   fdZdedefdZdej*                  defdZdedee   ddfdZej0                  fdej                  dej*                  dej                  fdZdedefdZdedefdZdedededededefdZdpdededefdZdededefdZdededefdZded edefd!Z ded"edefd#Z!dpded$ed%edefd&Z"d'ed(ed)edefd*Z#dedefd+Z$dedefd,Z%ded-ee   defd.Z&d-eeee   f   dee   fd/Z'	 dqded-eeee   f   d0eeeef      d1e(def
d2Z	 	 drded3ee   d4e(d5ee   def
d6Z)	 dsded7eee      d4e(d0eeeeee   f      d8ee(   d9eee      ddfd:Z*ded;eej*                     deeeeej*                  f   fd<Z+ded=ed>ed?ej*                  def
d@Z,dedAedBe(d0eeeeee   f      def
dCZ-dDedEedFedGedHedefdIZ.	 	 dtded7ee   d4e(d0eeeeee   f      def
dJZ/d7ee   dEedFedeeef   fdKZ0	 	 	 duded7ee   d4e(dLed0eeeeee   f      defdMZ1d9ee   dGedHedej*                  dNejd                  defdOZ3	 	 dvdedPee   d4e(d0eeeeee   f      def
dQZ4dRedSedefdTZ5dRee   dSee   dej*                  dNejd                  def
dUZ6dedRee   dSee   defdVZ7dedefdWZ8dedXedefdYZ9dedZedefd[Z:dedefd\Z;ded]edefd^Z<dedefd_Z=d`edefdaZ>dedefdbZ?dedefdcZ@dwddedeee   dfee   dgedef
dhZAdwdediedjedFedEedkedgedefdlZBd3ee   defdmZC	 	 dvdedned4e(d0eeeeee   f      def
doZDy)x    N)ListOptionalTupleUnion)Tensor)conv2dgrid_sampleinterpolatepadxreturnc                      | j                   dk\  S )N   )ndim)r   s    tC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torchvision/transforms/_functional_tensor.py_is_tensor_a_torch_imager   	   s    66Q;    imgc                 0    t        |       st        d      y )NzTensor is not a torch image.)r   	TypeErrorr   s    r   _assert_image_tensorr      s    #C(677 )r   c                     t        |        | j                  dk(  rdn| j                  d   }| j                  dd  \  }}|||gS )Nr      )r   r   shape)r   channelsheightwidths       r   get_dimensionsr!      sC    HHMqsyy}HIIbcNMFEfe$$r   c                 T    t        |        | j                  d   | j                  d   gS )Nr   )r   r   r   s    r   get_image_sizer$      s%    IIbM399R=))r   c                     t        |        | j                  dk(  ry| j                  dkD  r| j                  d   S t        d| j                         )Nr   r   r   z$Input ndim should be 2 or more. Got )r   r   r   r   r   s    r   get_image_num_channelsr&      sH    
xx1}	Ayy}
:388*E
FFr   dtypec                     | t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j
                  k(  ryy)N      i  il    r   )torchuint8int8int16int32int64r'   s    r   
_max_valuer2   )   sR    	%**		%++		%++		%++	" r   	permittedc                 J    t        |       d   }||vrt        d| d|       y )Nr   z0Input image tensor permitted channel values are z, but found )r!   r   )r   r3   cs      r   _assert_channelsr6   :   s:    sAA	J9+Uabcadeff r   imagec                    | j                   |k(  r| S | j                         rt        j                  d|      j                         r| j	                  |      S | j                   t        j
                  k(  r"|t        j                  t        j                  fv s0| j                   t        j                  k(  r1|t        j                  k(  rd| j                    d| d}t        |      d}t        t        |            }| j                  |dz   |z
        }|j	                  |      S t        t        | j                               }t        j                  d|      j                         r| j	                  |      } | |z  S t        t        |            }||kD  r=t        |dz   |dz   z        }t        j                  | |d	
      } | j	                  |      S t        |dz   |dz   z        }| j	                  |      } | |z  S )Nr   r1   zThe cast from z to z cannot be performed safely.gMbP?      ?r   floorrounding_mode)r'   is_floating_pointr+   tensortofloat32r/   r0   float64RuntimeErrorfloatr2   mulintdiv)	r7   r'   msgepsmax_valresult	input_max
output_maxfactors	            r   convert_image_dtyperN   @   s   {{e  <<'99;88E?" KK5==(Uu{{EKK6P-PKK5==(Uekk-A"5;;-tE7:VWCs## 
5)*7S=3./yy*U[[12	 <<'99;HHUOE9$$:e,-
 z! )a-Z!^<=FIIeV7CE88E?" *q.i!m<=FHHUOE6>!r   c                 :    t        |        | j                  d      S )Nr   r   flipr   s    r   vfliprR   t       88B<r   c                 :    t        |        | j                  d      S )Nr#   rP   r   s    r   hfliprU   z   rS   r   topleftr   r    c           
         t        |        t        |       \  }}}||z   }||z   }	|dk  s|dk  s
||kD  s|	|kD  rt        | t        d|      z   d      t        | t        d|	      z   d      t        |t        ||      z
  d      t        |	t        ||      z
  d      g}
t	        | dt        |d      |	t        |d      |f   |
d      S | d||	||f   S )Nr   .fill)r   r!   maxminr   )r   rV   rW   r   r    _hwrightbottompadding_ltrbs              r   croprc      s    S!GAq!5LE6\Fax37eai6A:Au%q)s1f~%q)At$a(Q$a(	
 3sCQK&0#dA,2FFG\]^^sCJU
*++r   num_output_channelsc                    | j                   dk  rt        d| j                          t        | ddg       |dvrt        d      | j                  d   dk(  rS| j                  d      \  }}}d|z  d	|z  z   d
|z  z   j                  | j                        }|j                  d      }n| j                         }|dk(  r|j                  | j                        S |S )N   @Input image tensor should have at least 3 dimensions, but found r   )r   rf   z+num_output_channels should be either 1 or 3r   dimgŏ1w-!?gbX9?gv/?)r   r   r6   
ValueErrorr   unbindr?   r'   	unsqueezecloneexpand)r   rd   rgbl_imgs         r   rgb_to_grayscalers      s    
xx!|Z[^[c[cZdeffS1a&!&(FGG
yy}***$1a !eai'%!)377		BB'		a||CII&&Lr   brightness_factorc                     |dk  rt        d| d      t        |        t        | ddg       t        | t	        j
                  |       |      S )Nr   zbrightness_factor () is not non-negative.r   rf   )rj   r   r6   _blendr+   
zeros_like)r   rt   s     r   adjust_brightnessry      sS    1./@.AAWXYYS1a&!#u'',.?@@r   contrast_factorc                    |dk  rt        d| d      t        |        t        | ddg       t        |       d   }t	        j
                  |       r| j                  nt        j                  }|dk(  r1t	        j                  t        |       j                  |      dd      }n't	        j                  | j                  |      dd      }t        | ||      S )	Nr   zcontrast_factor (rv   rf   r   )r   r   r#   Tri   keepdim)rj   r   r6   r!   r+   r=   r'   r@   meanrs   r?   rw   )r   rz   r5   r'   r~   s        r   adjust_contrastr      s    ,_,==STUUS1a&!sAA005CII5==EAvzz*3/2259|UYZzz#&&-\4H#t_--r   
hue_factorc                    d|cxk  rdk  sn t        d| d      t        | t        j                        st	        d      t        |        t        | ddg       t        |       d   dk(  r| S | j                  }t        | t        j                        } t        |       } | j                  d	
      \  }}}||z   dz  }t        j                  |||fd	
      } t        |       }t        ||      S )N            ?zhue_factor (z) is not in [-0.5, 0.5].z Input img should be Tensor imager   rf   r   r   rh   r9   )rj   
isinstancer+   r   r   r   r6   r!   r'   rN   r@   _rgb2hsvrk   stack_hsv2rgb)r   r   
orig_dtyper^   svimg_hue_adjs          r   
adjust_huer      s    J%#%<
|3KLMMsELL):;;S1a&!c1"
J
c5==
1C
3-CjjRj GAq!	
Z3A
++q!QiR
(C3-K{J77r   saturation_factorc                     |dk  rt        d| d      t        |        t        | ddg       t        |       d   dk(  r| S t	        | t        |       |      S )Nr   zsaturation_factor (rv   r   rf   )rj   r   r6   r!   rw   rs   )r   r   s     r   adjust_saturationr      se    1./@.AAWXYYS1a&!c1"
#',.?@@r   gammagainc                 N   t        | t        j                        st        d      t	        | ddg       |dk  rt        d      | }| j                  }t        j                  |       st        |t        j                        }|||z  z  j                  dd      }t        ||      }|S )NzInput img should be a Tensor.r   rf   r   z*Gamma should be a non-negative real number)r   r+   r   r   r6   rj   r'   r=   rN   r@   clamp)r   r   r   rJ   r'   s        r   adjust_gammar      s    c5<<(788S1a&!qyEFFFIIE""3'$VU]];VU]"))!Q/F /FMr   img1img2ratioc                     t        |      }t        | j                        }|| z  d|z
  |z  z   j                  d|      j	                  | j                        S )Nr9   r   )rC   r2   r'   r   r?   )r   r   r   bounds       r   rw   rw      sM    %LEtzz"EDLC%K4//66q%@CCDJJOOr   c                 d   | j                  d      \  }}}t        j                  | d      j                  }t        j                  | d      j                  }||k(  }||z
  }t        j
                  |      }|t        j                  |||      z  }	t        j                  |||      }
||z
  |
z  }||z
  |
z  }||z
  |
z  }||k(  ||z
  z  }||k(  ||k7  z  d|z   |z
  z  }||k7  ||k7  z  d|z   |z
  z  }||z   |z   }t        j                  |dz  dz   d      }t        j                  ||	|fd      S )Nr   rh   g       @g      @      @r9   )	rk   r+   r[   valuesr\   	ones_likewherefmodr   )r   ro   rp   rq   maxcminceqccronesr   
cr_divisorrcgcbchrhghbr^   s                     r   r   r     sI   jjRj GAq! 99Sb!((D99Sb!((D $,C	B??4 D
U[[dD))A
 S$+J
(j	 B
(j	 B
(j	 B
!)R	 B19
#b2	6B19
#b2	6B
R"A

AGcMC(A;;1d|,,r   c                 F   | j                  d      \  }}}t        j                  |dz        }|dz  |z
  }|j                  t        j                        }t        j
                  |d|z
  z  dd      }t        j
                  |d||z  z
  z  dd      }t        j
                  |d|d|z
  z  z
  z  dd      }|dz  }|j                  d      t        j                  d|j                        j                  d	d
d
      k(  }	t        j                  ||||||fd      }
t        j                  ||||||fd      }t        j                  ||||||fd      }t        j                  |
||fd      }t        j                  d|	j                  | j                        |      S )Nr   rh   r   r1   r9   g           devicer#   r   z...ijk, ...xijk -> ...xjk)rk   r+   r:   r?   r/   r   rl   aranger   viewr   einsumr'   )r   r^   r   r   ifpqtmaska1a2a3a4s                 r   r   r   -  st   jjRj GAq!AGA	
SAA	5;;AQ#']S#.AQ#A+&c2AQ#S1W-.c:A	AA;;2;%,,q"B"G"GAq"QQD	aAq!Q'R	0B	aAq!Q'R	0B	aAq!Q'R	0B	b"b\r	*B<<3TWW399W5MrRRr   paddingc                 *   |d   dk  s|d   dk  s|d   dk  s|d   dk  rf|D cg c]  }t        |d        }}|\  }}}}| d|| j                  d   |z
  || j                  d   |z
  f   } |D cg c]  }t        |d       }}| j                         }t	        |d         D 	cg c]  }	|	 }
}	t	        |d   dz
  dd      D 	cg c]  }	|	 }}	t	        |d         D 	cg c]  }	|	dz    
 }}	t        j                  ||
z   |z   | j                        }t	        |d         D 	cg c]  }	|	 }}	t	        |d   dz
  dd      D 	cg c]  }	|	 }}	t	        |d         D 	cg c]  }	|	dz    
 }}	t        j                  ||z   |z   | j                        }| j                  }|dk(  r| d d |d d d f   |d d d f   f   S |d	k(  r| d d d d |d d d f   |d d d f   f   S t        d
      c c}w c c}w c c}	w c c}	w c c}	w c c}	w c c}	w c c}	w )Nr   r   r   rf   .r   r#   r      z6Symmetric padding of N-D tensors are not supported yet)
r\   r   r[   sizeranger+   r>   r   r   rB   )r   r   r   neg_min_padding	crop_left
crop_rightcrop_topcrop_bottomin_sizesr   
_x_indicesleft_indicesright_indices	x_indices
_y_indicestop_indicesbottom_indices	y_indicesr   s                      r   _pad_symmetricr   B  sR    qzA~a71:>WQZ!^/67w!C1I:w77F4	:x#x#))B-+"==y399UW=[eKe?eef&-.g3q!9g.xxzH"8B<010!0J1$WQZ!^R<=<!A<L=',WQZ'89'8!q1uX'8M9\J6FszzZI"8B<010!0J1#GAJNB;<;1;K<(-gaj(9:(91Ah(9N:[:5FszzZI88Dqy1i4()D!G*<<==	1a1d7+YtQw-??@@STT/ 8 / 2=9 2<:s/   G-2G2'	G7	G<"H(	H	H#Hc                 (   t        | t              r2t        j                  j	                         rt        d      | x}x}x}}nKt        |       dk(  r| d   x}x}x}}n1t        |       dk(  r| d   x}}| d   x}}n| d   }| d   }| d   }| d   }||||gS )NzHpadding can't be an int while torchscripting, set it as a list [value, ]r   r   r   rf   )r   rE   r+   jitis_scriptingrj   len)r   pad_left	pad_rightpad_top
pad_bottoms        r   _parse_pad_paddingr   a  s    '399!!#ghh6===9=w	W	6=aj@@9@w	W	&qz)9&qz)*1:!*AJ	QZ
i*55r   rZ   padding_modec                    t        |        |d}t        |t        t        t        f      st        d      t        |t        t        f      st        d      t        |t              st        d      t        |t              rt	        |      }t        |t              r%t        |      dvrt        dt        |       d      |dvrt        d	      t        |      }|d
k(  rd}n|dk(  rt        | |      S d}| j                  dk  r| j                  d      } d}| j                  }d}|dk7  rM| j                  t        j                   t        j"                  fvr!d}| j%                  t        j                         } |dv rt'        | ||      } nt'        | ||t        |            } |r| j)                  d      } |r| j%                  |      } | S )Nr   zGot inappropriate padding argzGot inappropriate fill argz"Got inappropriate padding_mode arg)r   r   r   z<Padding must be an int or a 1, 2, or 4 element tuple, not a z element tuple)constantedgereflect	symmetriczBPadding mode should be either constant, edge, reflect or symmetricr   	replicater   Fr   rh   Tr   )r   r   mode)r   value)r   r   rE   tuplelistr   rC   strr   rj   r   r   r   rl   r'   r+   r@   rA   r?   	torch_padsqueeze)r   r   rZ   r   r   need_squeeze	out_dtype	need_casts           r   r   r   u  s    |gUD12788dS%L)455lC(<=='5!w-'4  w<y(NsSZ|n\jk  GG]^^7#Av"		$c1%%L
xx!|mmm"		II
"		%--9W(W 	ffU]]#//Q\2Q\tEkkak ffYJr   r   interpolation	antialiasc                 l   t        |        t        |t              rt        |      }|d}|r|dvrd}t	        | t
        j                  t
        j                  g      \  } }}}|dv rdnd }t        | ||||      } |dk(  r&|t
        j                  k(  r| j                  dd      } t        | |||      } | S )	NF)bilinearbicubic)r   r   align_cornersr   r   r   r)   )r\   r[   )r   r   r   )r   r   r   r   _cast_squeeze_inr+   r@   rA   r
   r,   r   _cast_squeeze_out)r   r   r   r   r   r   r   r   s           r   resizer     s     $Dz	]*AA
 	.>sU]]TYTaTaDb.c+CL) +.EEE4M
c=aj
kC	!i5;;&>iiA3i'
C9<[d
eCJr   matrixsupported_interpolation_modescoeffsc                 n   t        | t        j                        st        d      t	        |        |t        |t
              st        d      |t        |      dk7  rt        d      |t        |      dk7  rt        d      |5t        |t        t        t        t
        f      st        j                  d       t        |       d   }|Xt        |t        t
        f      rBt        |      d	kD  r4t        |      |k7  r&d
}t        |j                  t        |      |            ||vrt        d| d      y )NzInput img should be Tensorz Argument matrix should be a listr   z*Argument matrix should have 6 float values   z*Argument coeffs should have 8 float valuesz8Argument fill should be either int, float, tuple or listr   r   ziThe number of elements in 'fill' cannot broadcast to match the number of channels of the image ({} != {})zInterpolation mode 'z"' is unsupported with Tensor input)r   r+   r   r   r   r   r   rj   rE   rC   r   warningswarnr!   format)r   r   r   rZ   r   r   num_channelsrG   s           r   _assert_grid_transform_inputsr     s'    sELL)455*VT"::;;c&kQ.EFFc&kQ.EFF
4#ueT1J KPQ "#&q)LJteT];D	ARUVZR[_kRk/ 	 CI|<==99/>`abb :r   
req_dtypesc                     d}| j                   dk  r| j                  d      } d}| j                  }d}||vrd}|d   }| j                  |      } | |||fS )NFr   r   rh   T)r   rl   r'   r?   )r   r   r   r   r   	req_dtypes         r   r   r     sh    L
xx!|mmm"		II
"	qM	ffY	<22r   r   r   r   c                    |r| j                  d      } |ru|t        j                  t        j                  t        j                  t        j
                  t        j                  fv rt        j                  |       } | j                  |      } | S )Nr   rh   )	r   r+   r,   r-   r.   r/   r0   roundr?   )r   r   r   r   s       r   r   r     s`    kkak ejj%++u{{EKKXX++c"CffYJr   gridr   c                    t        | |j                  g      \  } }}}| j                  d   dkD  rH|j                  | j                  d   |j                  d   |j                  d   |j                  d         }|pt	        j
                  | j                  d   d| j                  d   | j                  d   f| j                  | j                        }t	        j                  | |fd      } t        | ||dd	      } || d d d
d d d d d f   }| d d d d
d d d d f   } |j                  |       }t        |t        t        f      r|t        |      fnt        |      gdf\  }}	t	        j                  || j                  | j                        j!                  d|	dd      j                  |       }
|dk(  r|dk  }|
|   | |<   n| |z  d|z
  |
z  z   } t#        | |||      } | S )Nr   r   r   rf   r'   r   rh   zerosF)r   r   r   r#   nearestr   r9   )r   r'   r   rn   r+   r   r   catr	   	expand_asr   r   r   r   rC   r>   r   r   )r   r  r   rZ   r   r   r   r   	fill_listlen_fillfill_imgs              r   _apply_grid_transformr    s    /?sTZZL.Q+CL)
yy|a{{399Q<A

1tzzRS}U zz399Q<CIIaL#))A,Gsyyadakakliid+
c4dPU
VC 1bc1a< !SbS!Q,~~c"3=dUDM3RtSY/Z_`dZeYfhiXj	8<<	3::NSSTUW_abdefppqtu9#:D CI*d
h66C
CL)
DCJr   thetar_   r^   owohc                    d}t        j                  d||d| j                  | j                        }t        j                  | dz  |z   |dz  |z   dz
  || j                        }|d   j                  |       t        j                  | dz  |z   |dz  |z   dz
  || j                        j                  d      }|d   j                  |       |d	   j                  d       | j                  dd
      t        j                  d|z  d|z  g| j                  | j                        z  }	|j                  d||z  d      j                  |	      }
|
j                  d||d
      S )Nr   r   rf   r  stepsr   .r   r#   .r   .r   r   )r+   emptyr'   r   linspacecopy_
unsqueeze_fill_	transposer>   r   bmm)r  r_   r^   r  r  d	base_gridx_gridy_gridrescaled_thetaoutput_grids              r   _gen_affine_gridr&  A  sA    	AAr2qELLQI^^RC#IM28a<!+;2ell[FfF#^^RC#IM28a<!+;2ell[ffgijFfF#fA__Q*U\\37C!G:LTYT_T_hmhtht-uuN..BGQ/33NCKAr2q))r   c                 Z   t        | |||ddg       t        j                  |       r| j                  nt        j                  }t        j
                  ||| j                        j                  ddd      }| j                  }t        ||d   |d   |d   |d   	      }t        | |||
      S )Nr	  r   r  r   r   rf   r#   r   r_   r^   r  r  rY   )r   r+   r=   r'   r@   r>   r   reshaper   r&  r  )r   r   r   rZ   r'   r  r   r  s           r   affiner*  [  s     "#v}dYPZD[\005CII5==ELLuSZZ@HHAqQEIIEEU2Y%)b	eTViXD dMEEr   c                    t        j                  d|z  d|z  dgd|z  d|z  dgd|z  d|z  dgd|z  d|z  dgg      }t        j                  | t         j                        j                  dd      }t        j                  ||j
                        }|j                  d      \  }}|j                  d      \  }}|t        j                  |dz  |dz  f      z  }|t        j                  |dz  |dz  f      z  }d	}	t        j                  ||	z  j                         |	z        }
t        j                  ||	z  j                         |	z        }|
|z
  }t        |d         t        |d
         fS )Nr   r9   r   r1   r   rf   r   rh   g-C6?r   )r+   r>   rC   r   matmulTr\   r[   ceiltrunc_r:   rE   )r   r_   r^   ptsr  new_ptsmin_valsr]   max_valstolcmaxcminr   s                r   _compute_affine_output_sizer7  k  sk    ,,AXtax%AXsQw$1WcAgs#1WdQh$		
C LLu{{388A>Ell3(G++!+$KHa++!+$KHa a#gq3w/00Ha#gq3w/00H C::x#~--/#56D;;3..0367D$;DtAw<T!W%%r   rn   c                    t        | |||ddg       | j                  d   | j                  d   }}|rt        |||      n||f\  }}t        j                  |       r| j
                  nt        j                  }	t        j                  ||	| j                        j                  ddd      }
t        |
||||	      }t        | |||
      S )Nr	  r   r#   r   r  r   r   rf   r(  rY   )r   r   r7  r+   r=   r'   r@   r>   r   r)  r&  r  )r   r   r   rn   rZ   r_   r^   r  r  r'   r  r  s               r   rotater9    s     "#v}dYPZD[\99R=#))B-qA:@(A6q!fFB005CII5==ELLuSZZ@HHAqQEEQ!r:D dMEEr   r   c                 l   t        j                  | d   | d   | d   g| d   | d   | d   ggg||      }t        j                  | d   | d	   d
g| d   | d	   d
ggg||      }d}t        j                  d||d||      }t        j                  ||d
z  |z   d
z
  ||      }	|d   j	                  |	       t        j                  ||d
z  |z   d
z
  ||      j                  d      }
|d   j	                  |
       |d   j                  d       |j                  dd      t        j                  d|z  d|z  g||      z  }|j                  d||z  d      j                  |      }|j                  d||z  d      j                  |j                  dd            }||z  d
z
  }|j                  d||d      S )Nr   r   r   rf   r      r  r      r9   r   r  r  r#   r  r  )
r+   r>   r  r  r  r  r  r  r   r  )r   r  r  r'   r   theta1theta2r   r!  r"  r#  rescaled_theta1output_grid1output_grid2r%  s                  r   _perspective_gridrB    s    \\!9fQi
+fQiF1I-N	OPX]flF \\VAYq	37&)VAYPS9TUV^clrsFAAr2qfEI^^ArCx!|c1FKFfF#^^ArCx!|c1FKVVWYZFfF#fA&&q!,u||S2XsRx<PX]fl/mmO>>!R"Wa044_EL>>!R"Wa044V5E5Ea5KLL-3KAr2q))r   perspective_coeffsc                 x   t        | t        j                        st        d      t	        |        t        | d ||ddg|       | j                  d   | j                  d   }}t        j                  |       r| j                  nt        j                  }t        ||||| j                        }t        | |||      S )	NzInput img should be Tensor.r	  r   )r   r   rZ   r   r   r#   r   )r  r  r'   r   rY   )r   r+   r   r   r   r   r   r=   r'   r@   rB  r   r  )r   rC  r   rZ   r  r  r'   r  s           r   perspectiverE    s     sELL)566!#'0*&=! YYr]CIIbMB005CII5==E/B2USVS]S]^D dMEEr   kernel_sizesigmac                     | dz
  dz  }t        j                  | ||       }t        j                  d||z  j                  d      z        }||j	                         z  }|S )Nr   r   )r  r   r   )r+   r  exppowsum)rF  rG  
ksize_halfr   pdfkernel1ds         r   _get_gaussian_kernel1drO    sX    /S(J
{JkBA
))DAI??1--
.CSWWYHOr   c                     t        | d   |d         j                  ||      }t        | d   |d         j                  ||      }t        j                  |d d d f   |d d d f         }|S )Nr   r1   r   )rO  r?   r+   mm)rF  rG  r'   r   
kernel1d_x
kernel1d_ykernel2ds          r   _get_gaussian_kernel2drU    su     (AaADDVSXDYJ'AaADDVSXDYJxx
1d7+Za-@AHOr   c                 j   t        | t        j                        st        dt	        |              t        |        t        j                  |       r| j                  nt        j                  }t        |||| j                        }|j                  | j                  d   d|j                  d   |j                  d         }t        | |j                  g      \  } }}}|d   dz  |d   dz  |d   dz  |d   dz  g}t        | |d      } t        | || j                  d   	      } t!        | |||      } | S )
Nimg should be Tensor. Got r  r   r   r   r   r   r   groups)r   r+   r   r   typer   r=   r'   r@   rU  r   rn   r   r   r   r   r   )	r   rF  rG  r'   kernelr   r   r   r   s	            r   gaussian_blurr\    s   sELL)4T#YK@AA005CII5==E#KeCJJWF]]399R=!V\\!_fll1oNF.>sV\\N.S+CL) 1~"KNa$7Q19LkZ[n`aNabG
Cy
1C
fSYYr]
3C
CL)
DCJr   c                     t        |        | j                  dk  rt        d| j                         t        | ddg       t	        | j
                        | z
  S )Nrf   rg   r   )r   r   r   r6   r2   r'   r   s    r   invertr^    sR    
xx!|Z[^[c[cZdeffS1a&!cii 3&&r   bitsc                    t        |        | j                  dk  rt        d| j                         | j                  t        j
                  k7  rt        d| j                         t        | ddg       t        dd|z
  z         }| |z  S )Nrf   rg   8Only torch.uint8 image tensors are supported, but found r   r   r   )r   r   r   r'   r+   r,   r6   rE   )r   r_  r   s      r   	posterizerb  	  s    
xx!|Z[^[c[cZdeff
yyEKKRSVS\S\R]^__S1a&!a$h  D:r   	thresholdc                    t        |        | j                  dk  rt        d| j                         t        | ddg       |t	        | j
                        kD  rt        d      t        |       }t        j                  | |k\  ||       S )Nrf   rg   r   z+Threshold should be less than bound of img.)	r   r   r   r6   r2   r'   r^  r+   r   )r   rc  inverted_imgs      r   solarizerf    s|    
xx!|Z[^[c[cZdeffS1a&!:cii((EFF#;L;;si's;;r   c                    t        j                  |       r| j                  nt         j                  }t        j                  d|| j
                        }d|d<   ||j                         z  }|j                  | j                  d   d|j                  d   |j                  d         }t        | |j                  g      \  }}}}t        |||j                  d         }t        ||||      }| j                         }||d	dd
dd
f<   |S )N)rf   rf   r  g      @)r   r   r   r   r   rX  .r#   )r+   r=   r'   r@   r   r   rK  rn   r   r   r   r   rm   )r   r'   r[  
result_tmpr   r   r   rJ   s           r   _blurred_degenerate_imageri  '  s    005CII5==EZZeCJJ?FF4L
fjjlF]]399R=!V\\!_fll1oNF5EcFLL>5Z2J	<
F:3C3CB3GHJ":y,	RJYY[F(F3"ad?Mr   sharpness_factorc                     |dk  rt        d| d      t        |        t        | ddg       | j                  d      dk  s| j                  d      dk  r| S t	        | t        |       |      S )	Nr   zsharpness_factor (rv   r   rf   r#   r   r   )rj   r   r6   r   rw   ri  )r   rj  s     r   adjust_sharpnessrl  9  sr    !-.>-??UVWWS1a&!
xx|qCHHRLA-
#057GHHr   c                 b   t        |        | j                  dk  rt        d| j                         t        | ddg       t	        | j
                        }t        j                  |       r| j
                  nt        j                  }| j                  dd      j                  |      }| j                  dd      j                  |      }|||z
  z  }t        j                  |      j                         }d||<   d||<   | |z
  |z  j                  d|      j                  | j
                        S )Nrf   rg   r   )r   r#   Tr|   r   )r   r   r   r6   r2   r'   r+   r=   r@   aminr?   amaxisfinitelogical_notr   )r   r   r'   minimummaximumscaleeq_idxss          r   autocontrastrv  G  s   
xx!|Z[^[c[cZdeffS1a&!syy!E005CII5==Ehh8Th255e<Ghh8Th255e<GWw&'EnnU#//1GGGE'N7]e#**1e477		BBr   img_chanc                    | j                   r7t        j                  | j                  t        j                        ddd      }n&t        j
                  | j                  d      d      }||dk7     }t        j                  |d d j                         dd      }|dk(  r| S t        j                  t        j                  |d      t        j                  |d	d      z   |d      }t        j                  j                  j                  |d
dg      d d j                  dd      }|| j                  t        j                           j                  t        j                        S )N   r   r)   )binsr\   r[   r#   )	minlengthr:   r;   r   r   )is_cudar+   histcr?   r@   bincountr)  rF   rK  cumsumnn
functionalr   r   r0   r,   )rw  histnonzero_histstepluts        r   _scale_channelr  ]  s   
 {{8;;u}}5CQCP~~h..r2cB	?L99\#2&**,cIDqy
))ELLq)EIIdAW,UUW[kr
sC
((


!
!#1v
.s
3
9
9!S
ACx{{5;;'(++EKK88r   c           	          t        j                  t        | j                  d            D cg c]  }t	        | |          c}      S c c}w )Nr   )r+   r   r   r   r  )r   r5   s     r   _equalize_single_imager  r  s;    ;;chhqk8JK8J1s1v.8JKLLKs   Ac                    t        |        d| j                  cxk  rdk  sn t        d| j                         | j                  t        j
                  k7  rt        d| j                         t        | ddg       | j                  dk(  rt        |       S t	        j                  | D cg c]  }t        |       c}      S c c}w )Nrf   r   z<Input image tensor should have 3 or 4 dimensions, but found ra  r   )	r   r   r   r'   r+   r,   r6   r  r   )r   r   s     r   equalizer  v  s    QVWZW_W_V`abb
yyEKKRSVS\S\R]^__S1a&!
xx1}%c**;;3?3a.q13?@@?s   +Cr>   r~   stdinplacec                    t        |        | j                         st        d| j                   d      | j                  dk  rt        d| j                                |s| j                         } | j                  }t        j                  ||| j                        }t        j                  ||| j                        }|dk(  j                         rt        d| d      |j                  d	k(  r|j                  d
d	d	      }|j                  d	k(  r|j                  d
d	d	      }| j                  |      j                  |      S )Nz+Input tensor should be a float tensor. Got .rf   zQExpected tensor to be a tensor image of size (..., C, H, W). Got tensor.size() = r  r   z*std evaluated to zero after conversion to z, leading to division by zero.r   r#   )r   r=   r   r'   r   rj   r   rm   r+   	as_tensorr   anyr   sub_div_)r>   r~   r  r  r'   s        r   	normalizer    s    ##%Efll^STUVV{{Q_`f`k`k`m_no
 	
 LLE??4uV]]CD
//#U6==
ACq~~EeWLjkllyyA~yyQ"
xx1}hhr1a ;;t!!#&&r   r   jr   c                 d    t        |        |s| j                         } || d|||z   |||z   f<   | S )N.)r   rm   )r   r   r  r^   r_   r   r  s          r   eraser    s>    iik%&CQQYAE	!"Jr   c                     | D cg c]&  }t        j                  | dz   |z  |dz
  |z  |      ( }}t        j                  |d      \  }}t        j                  ||gd      j	                  d      S c c}w )Nr   ij)indexingr#   r   )r+   r  meshgridr   rl   )r   r   hw_spacegrid_ygrid_xs        r   _create_identity_gridr    sp    FJKdQ!|a!eq[!<dHK^^Ht<NFF;;',66q99 Ls   +A3displacementc                 8   t        | t        j                        st        dt	        |              t        | j                  dd        }|j                  | j                        }t        |      }|j                  | j                        |z   }t        | |||      S )NrW  r   )r   r+   r   r   rZ  r   r   r?   r   r  r  )r   r  r   rZ   r   identity_gridr  s          r   elastic_transformr    s     sELL)4T#YK@AA		"#D??3::.L)$/MCJJ',6D dM4@@r   )r   )r   r   )r   T)N)r	  N)r	  FN)r   N)F)Er   typingr   r   r   r   r+   r   torch.nn.functionalr   r	   r
   r   r   boolr   r   rE   r!   r$   r&   r'   r2   r6   rC   rN   rR   rU   rc   rs   ry   r   r   r   r   rw   r   r   r   r   r   r   r   r   r   r  r&  r*  r7  r9  r   rB  rE  rO  rU  r\  r^  rb  rf  ri  rl  rv  r  r  r  r  r  r  r   r   r   <module>r     s;    / /   R R 4 8f 8 8
% %49 %* *49 *G G3 Gekk c "g& gT#Y g4 g CH++ 1"u|| 1"EKK 1"RWR^R^ 1"hv & v & ,f ,3 ,c ,3 ,s ,v ,$& s 6 .A6 Ae A A. .% .F ."8F 8 8& 82A6 Ae A Af U %  (P Pv Pe P P$-& $-V $-NS& SV S*U Uc Uv U>6c49n 5 6$s) 6* mw?	?T#Y/?7?c5j@Q7R?fi??J $ $	!	!
s)! ! ~	!
 !T %)$c	$cT%[!$c $c 5eT%[01
2	$c
 $(9$c T%[!$c 
$cN3& 3d5;;.? 3E&RVX\^c^i^iJiDj 3 
6 
d 
$ 
SXS^S^ 
ci 
	%(08sE4PU;?V9W0XD**
* * 		*
 	* *: #59	F	FKF F 5eT%[01
2	F
 F &U & & &cSVh &H #59F	FKF F 	F
 5eT%[01
2F F$*d5k *s * *EKK *Y^YeYe *jp *@ $59	F	FUF F 5eT%[01
2	F
 F4 E f c#';7<{{LQLLv DI d5k f *	' 	'6 	'6   <& <U <v < 6 f $I& IE If ICf C C,9V 9 9*M M6 MA& AV A"'f 'DK 'd5k 'D ']c '4v # # # # & 4 \b :S	 :f : $59	A	AA A 5eT%[01
2	A
 Ar   