o
    bi(                     @   sr  d dl Z d dlZd dlZd dl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ZdZdZh d	Zh d
ZdAddZdAddZdAddZ							dBddZ			 	dCddZ		 	dDddZdd Zdd Zdd  Zd!d" Zd#d$ Z	dEd%d&Z	dFd)d*Z 	+	,		-			dGd.d/Z!d0d1 Z"d2d3 Z#d4d5 Z$e"e#d6d7 d8d7 d9Z%d:d; Z&d<d= Z'	>dHd?d@Z(dS )I    N)backend)convert_to_tensor)moveaxis)	draw_seed)bilinearnearestlanczos3lanczos5bicubicarea)r   r   )constantr   wrapreflect>   r   mirrorr   r   r   >   cubiclinearr
   r   r   r	   tricubic	trilinearc                 C   s   t | } t|}|dkrdnd}t| jdvr td| j | j}t| jt}t	
| |} t g d| jd}t	j| ||dfd} t	j| |d	} t	
| |S )
Nchannels_last      yInvalid images rank: expected rank 3 (single image) or rank 4 (batch of images). Received input with shape: images.shape=)gŏ1w-!?gbX9?gv/?dtypeaxesaxis)r   r   standardize_data_formatlenshape
ValueErrorr   result_typefloattfcast	tensordotexpand_dims)imagesdata_formatchannels_axisoriginal_dtypecompute_dtypergb_weights r1   V/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/backend/tensorflow/image.pyrgb_to_grayscale3   s$   

r3   c                 C      t | } | j}t|}t| jdvrtd| j t|s*tdt| |dkrBt| jdkr<t	
| d} nt	
| d} t	j| } |dkrht| jdkr[t	
| d} | S t| jd	krht	
| d
} | S Nr   r   zCInvalid images dtype: expected float dtype. Received: images.dtype=channels_firstr   r      r      r9   r8   r   r   r   r9   r8   r   r8   r   r9   )r   r   r   r!   r"   r#   r$   is_float_dtypestandardize_dtyper'   	transposeimage
rgb_to_hsvr+   r,   r   r1   r1   r2   rA   K   6   

rA   c                 C   r4   r5   )r   r   r   r!   r"   r#   r$   r=   r>   r'   r?   r@   
hsv_to_rgbrB   r1   r1   r2   rD   h   rC   rD   r   Fr           c	              
      s  t |}|tvrtdt d| |dkrtd| |r&|r&tdt|dks3td| t|}tjdvrFtd	j |d
kr^tjdkrXtdntd|rt}	|	d |	d |\}
}t	t	|
 d| d}t
t|d}t	|d}t	t	| d|
 d}t
t|d}t	|d}t	t	| dd d}t	t	| dd d}tjdkrd d ||| ||| d d f n||| ||| d d f n|rt}	|	d |	d |\}
}t	t	|
 d| d}t
|}t	|d}t	t	| d|
 d}t
|}t	|d}t	t	| dd dt	t	| dd dtjdkrtd  td tdk fddfddtdk fddfddn2td tdkfddfddtdkfddfddtjj|||d}|d
krtjdkrt|d}|S tjdkrt|d }|S )!N<Invalid value for argument `interpolation`. Expected of one . Received: interpolation=r   z\Invalid value for argument `fill_mode`. Only `'constant'` is supported. Received: fill_mode=zIOnly one of `pad_to_aspect_ratio` & `crop_to_aspect_ratio` can be `True`.r8   zPArgument `size` must be a tuple of two elements (height, width). Received: size=r   r   r6   r   r7   r:   r   float32int32r9   r   r   c                      sD   t jt j fjd t j fjd gddS Nr   r9   r   r'   concatonesr   r1   )
batch_sizechannels
fill_valuer+   img_box_hstartwidthr1   r2   <lambda>   "    

zresize.<locals>.<lambda>c                          S Nr1   r1   r+   r1   r2   rT         c                      sD   t jt j fjd t j fjd gddS )Nr   r8   r   rL   r1   )rO   rP   rQ   heightr+   img_box_wstart
padded_imgr1   r2   rT     rU   c                      rV   rW   r1   r1   r\   r1   r2   rT     rY   c                      s@   t jt j fjd t j fjd gddS )Nr   r   r   rL   r1   )rP   rQ   r+   rR   rS   r1   r2   rT     "    c                      rV   rW   r1   r1   rX   r1   r2   rT   ,  rY   c                      s@   t jt j fjd t j fjd gddS rK   rL   r1   )rP   rQ   rZ   r+   r[   r\   r1   r2   rT   0  r^   c                      rV   rW   r1   r1   r]   r1   r2   rT   @  rY   )method	antialiasr;   r<   )r   r!   RESIZE_INTERPOLATIONSr$   r"   tupler#   r'   r?   r(   maximumminimumcondr@   resize)r+   sizeinterpolationr`   crop_to_aspect_ratiopad_to_aspect_ratio	fill_moderQ   r,   r#   target_heighttarget_widthcrop_height
crop_widthcrop_box_hstartcrop_box_wstart
pad_height	pad_widthresizedr1   )	rO   rP   rQ   rZ   r+   rR   r[   r\   rS   r2   rf      s  











rf   c                 C   sD  t |}|tvrtdt d| |tvr!tdt d| t| jdvr0td| j t|jdvr?td|j d	}t| jd
krQtj| dd} d}t|jdkr_tj|dd}|dkrit	| d} tj
j| tj|tjdt| dd || | d}t|| j}|dkrt	|d}|rtj|dd}|S )NrF   rG   8Invalid value for argument `fill_mode`. Expected of one . Received: fill_mode=r   r   )r9   r8   zInvalid transform rank: expected rank 1 (single transform) or rank 2 (batch of transforms). Received input with shape: transform.shape=Fr   r   r   Tr9   r6   r7   r   r   )r+   
transformsoutput_shaperQ   rh   rk   r;   )r   r!   AFFINE_TRANSFORM_INTERPOLATIONSr$   AFFINE_TRANSFORM_FILL_MODESr"   r#   r'   r*   r?   raw_opsImageProjectiveTransformV3r(   rI   upperensure_shapesqueeze)r+   	transformrh   rk   rQ   r,   need_squeezeaffinedr1   r1   r2   affine_transformO  sf   
r   c           	      C   s  t |}t|tjd}t|tjd}|tvr!tdt d| t| jdvr0td| j |jj	dvs?|jdd  dkrGtd	|j |jj	dvsV|jdd  dkr^td
|j |j|jkrptd|j d|j d}t| jdkrtj
| dd} d}t|jdkrtj
|dd}t|jdkrtj
|dd}|dkrt| d} t||}t|jdkrtj
|dd}tjj| tj|tjdt| dd || d}t|| j}|dkrt|d}|rtj|dd}|S )Nr   rF   rG   r   r   )r8   r   rH   )r   r8   zfInvalid start_points shape: expected (4,2) for a single image or (N,4,2) for a batch. Received shape: zdInvalid end_points shape: expected (4,2) for a single image or (N,4,2) for a batch. Received shape: zRstart_points and end_points must have the same shape. Received start_points.shape=z, end_points.shape=Fr   r   r   Tr8   r6   r7   r9   r   )r+   rw   rx   rQ   rh   r;   )r   r!   r   r'   rI   ry   r$   r"   r#   rankr*   r?   compute_homography_matrixr{   r|   r(   r}   r~   r   )	r+   start_points
end_pointsrh   rQ   r,   r   r   outputr1   r1   r2   perspective_transform  s~   

r   c                 C   s  | d d ddf | d d ddf }}| d d ddf | d d ddf }}| d d ddf | d d ddf }}| d d ddf | d d ddf }}	|d d ddf |d d ddf }
}|d d ddf |d d ddf }}|d d ddf |d d ddf }}|d d ddf |d d ddf }}t jt j|
|t |
t |
t |
t |
| |
 | | gddt jt |
t |
t |
|
|t |
| |
 | | gddt j||t |t |t |t || | | | gddt jt |t |t |||t || | | | gddt j||t |t |t |t || | | | gddt jt |t |t |||t || | | | gddt j||t |t |t |t || | | | gddt jt |t |t |||t ||	 | |	 | gddgdd}t j||||||||	gdd}t j|dd}t j||}t |ddg}|S )Nr   r9   r8   r   r   r      )r'   stack	ones_like
zeros_liker*   linalgsolvereshape)r   r   start_x1start_y1start_x2start_y2start_x3start_y3start_x4start_y4end_x1end_y1end_x2end_y2end_x3end_y3end_x4end_y4coefficient_matrixtarget_vectorhomography_matrixr1   r1   r2   r     s   &&&&&&&&







jn
r   c                 C   s"   |d }t | | d|  | S )Nr9   r8   )r'   abs)indexrg   sr1   r1   r2   _mirror_index_fixerg  s   r   c                 C   s(   t jtd|  d d| d d dS )Nr8   r9   )r'   mathfloordivr   )r   rg   r1   r1   r2   _reflect_index_fixerm  s   r   c                 C   s<   | j jr| nt| } t| tj}td| j }||fgS Nr9   )r   
is_integerr'   roundr(   rJ   r   )
coordinater   weightr1   r1   r2   _nearest_indices_and_weightss  s
   
r   c                 C   s<   t | }| | }d| }t |t j}||f|d |fgS r   )r'   floorr(   rJ   )r   lowerupper_weightlower_weightr   r1   r1   r2   _linear_indices_and_weights|  s
   
r   c                    s  t | }t |}|jd t|jkr td|j d|jd  t|jdk r/td|j  tvrAtdtt  d  t ||jd}tj	|dd	}|dkrVt
}n|d
kr]t}ntd fdd}g }	t||jD ]%\}
}||
}g }|D ]\}}|||\}}||||f q{|	| qog }tj|	 D ]R}t| \}}}tt|}tt||}|d j}t||}t||d j} dkrtj|dd	}t||}t|||}|ttj||  qttj|}|jjrt|}t||jS )Nr   zaFirst dim of `coordinates` must be the same as the rank of `inputs`. Received inputs with shape: z and coordinate leading dim of r8   zOInvalid coordinates rank: expected at least rank 2. Received input with shape: z8Invalid value for argument `fill_mode`. Expected one of rv   r   r   r9   z+map_coordinates currently requires order<=1c                    s
   dkr| dk| |k @ }t | d|d }||fS  dkr.t | d|d t j| t jdfS  dv rit | } |d }t j| |}||k }| }t |||| }  dkr_t || d | } | t j| t jdfS  d	kr~t j| |} | t j| t jdfS td
  )Nr   r   r9   r   r   )r   r   r8   r   r   zUnknown fill_mode: )	r'   clip_by_valuer   boolr   r   modwherer$   )coordsrg   validsafe_coordssize_2r   underoverrk   r1   r2   process_coordinates  s,   
z,map_coordinates.<locals>.process_coordinatesr   )r   r#   r"   r$   MAP_COORDINATES_FILL_MODESsetkeysr   r'   unstackr   r   NotImplementedErrorzipappend	itertoolsproductr?   r   	gather_ndr(   
reduce_allr   	functoolsreduceoperatormuladdr   r   )inputscoordinatesorderrk   rQ   	input_arrcoordinate_arrs
interp_funr   valid_1d_interpolationsr   rg   interp_nodesvalid_interpr   r   
safe_indexr   outputsitemsindices
validitiesweightsgatheredr   	all_validfill_value_typedresultr1   r   r2   map_coordinates  sr   


r   r   r         ?r   c           
      C   s   dd }t | } t| j}t ||d}t ||d}t| jdvr)td| j d}t| jdkr;tj| dd	} d
}|dkrEt	| d} t| d }|||||}tj
j| |g ddd}	|dkrit	|	d}	|rrtj|	dd	}	|	S )Nc                    sd   fdd  fdd}|| |}t || d | d ddf}t |dd|dg}t |}|S )Nc                    s>   t j|  d| d d  }t d|| d  }|t | S )Nr   r9   r8         )r'   rangeexp
reduce_sum)rg   sigmaxkernel1dr   r1   r2   _get_gaussian_kernel1d  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel1dc                    s@   t | }  | d |d } | d |d }t j||ddS )Nr   r9   r   )r'   r(   r)   )rg   r   
kernel1d_x
kernel1d_yr   r   r1   r2   _get_gaussian_kernel2d  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel2dr   r9   )r'   r   tiler(   )kernel_sizer   num_channelsr   r   kernelr1   r   r2   _create_gaussian_kernel  s   
z.gaussian_blur.<locals>._create_gaussian_kernelr   r   r   Fr   r   r   Tr6   r7   r   )r9   r9   r9   r9   SAME)stridespaddingr;   )r   r   r>   r   r"   r#   r$   r'   r*   r?   nndepthwise_conv2dr   )
r+   r   r   r,   r   r   r   r   r   blurred_imagesr1   r1   r2   gaussian_blur  s6   r         4@      @r   c              	      s  t |}tvrtdt d tvr!tdt d tjdvr0tdj tj}t||d}t||d}t|dd}	d	|	 d
B d	|	 d
B f}
d}tjdkrgt	j
ddd}|dkruj\}}}}d}n	j\}}}}d
}t|}|d u rd
}t	jj|||fdd||d| }t	jj|||fdd||d| }tt	j
||d|
||f|d}tt	j
||d|
||f|d}t	j||d}t	j||d}t	jt	j||dt	j||ddd\}}t	j
|dd}t	j
|dd}|||   |||  g }|dkr4t|D ]t	j fddt|D dd}|| qt	j|dd}n*t|D ]t	j fddt|D dd}|| q8t	j|d
d}|rht	j|dd}t	||}|S )NrF   rG   ru   rv   r   r   r   rJ      r9   Fr   r   r   Tr   r   rE   r   )r#   meanstddevr   seed)r   r   r,   xy)indexingc              	      s:   g | ]}t |d f |  | gtdqS .)r   rk   rQ   r   ry   r   .0bdistorted_xdistorted_yrk   rQ   ir+   rh   r1   r2   
<listcomp>      
z%elastic_transform.<locals>.<listcomp>c              	      s:   g | ]}t |d f |  | gtdqS r	  r
  r  r  r1   r2   r    r  )r   r!   ry   r$   rz   r"   r#   r   r   r'   r*   r   randomstateless_normalr   r   meshgridr   r   r   r(   )r+   alphar   rh   rk   rQ   r  r,   input_dtypekernel_factorr   r   rO   rZ   rS   rP   channel_axisdxdyr   ychannel_outputschannel_transformedtransformed_imagesr1   r  r2   elastic_transform  s   





r!  c                 C   s"   t t jd| jddt |  S )Nr   r   r9   )r'   rc   r   r   r   r   r1   r1   r2   _fill_triangle_kernel  s   "r#  c                 C   sT   d|  d |  |  d }t | dkd|  d |  d |  d |}t | dkd|S )Ng      ?g      @r   r   g      @g       @rE   )r'   r   )r   outr1   r1   r2   _fill_keys_cubic_kernel  s   *r%  c                 C   sp   | t tj|  t tj| |   }t |dkt |t |dktjd |d  dd}t || kd|S )NgMbP?r   r8   r9   rE   )r'   sinnppir   divide)radiusr   r  r$  r1   r1   r2   _fill_lanczos_kernel  s
   (.r+  c                 C   
   t d| S )Ng      @r+  r"  r1   r1   r2   rT        
 rT   c                 C   r,  )Nr  r-  r"  r1   r1   r2   rT     r.  )r   r   r   r	   c                 C   s  t |j|j}d| }|rt|dnd}tj||dd | ||  d }	t|	tjd d f tj| |dd d tjf  | }
||
}tj|ddd}t	t|dt
ttjj kt|t	|dk|dd}tj| |dd }t	t|	d	k|	|ktjd d f |dS )
Nr   r   g      ?r   T)r    keepdimsg     @@r9   r   )r   r%   r   r'   rc   r   r   newaxisr   r   r&   r'  finforI   epsr)  r(   logical_and)
input_sizeoutput_sizescaletranslationr   r`   r   	inv_scalekernel_scalesample_fr   r   total_weight_suminput_size_minus_0_5r1   r1   r2   _compute_weight_mat  sD   r=  c              
   C   s   t | } t| }t|dkr| S t| jr!t| tj}d}	nt	| }d}	t
|D ]4\}
}|| j }|| || }}tt||||
 ||
 |||j}tj|||dfd}t|d|}q,|	rztt|t| t| }t|| j}|S )Nr   TFr   r   )r   r'   r#   r"   r   is_int_dtyper   r(   rI   identity	enumeratendimr=  r)   r   r   r   
reduce_min
reduce_max)r   rx   spatial_dimsr6  r7  r   r`   input_shaper   use_roundingr  dmnwr1   r1   r2   _scale_and_translate  s4   


rK  Tc           	      C   s   |t vrtdt  d| |dv rd}n|dv rd}t| } t|}t|}t| }t|j|j}t||}t||}t	| ||||||S )Nz5Invalid value for argument `method`. Expected of one z. Received: method=)r   r   r   triangler   )r   r
   r   r   )
SCALE_AND_TRANSLATE_METHODSr$   r   _kernelsr   r%   r   r'   r(   rK  )	r+   rx   r6  r7  rD  r_   r`   r   r   r1   r1   r2   scale_and_translate  s8   	rO  rW   )r   FFFr   rE   N)r   r   r   N)r   r   N)r   rE   )r   r   N)r  r  r   r   rE   NN)T))r   r   r   numpyr'  
tensorflowr'   	keras.srcr   !keras.src.backend.tensorflow.corer   "keras.src.backend.tensorflow.numpyr   keras.src.random.seed_generatorr   ra   ry   rz   r   rM  r3   rA   rD   rf   r   r   r   r   r   r   r   r   r   r!  r#  r%  r+  rN  r=  rK  rO  r1   r1   r1   r2   <module>   s    


 
 N
@
N 		
c
:
 	%'