o
    biw                     @   s  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 ddZh dZh dZh d	Zd*d
dZd*ddZd*ddZ							d+ddZ			 	d,ddZ		 	d-ddZdd Z	d.ddZ	d/d d!Z	"	#		$			d0d%d&Z	'd1d(d)ZdS )2    N)backend)convert_to_tensor)	draw_seed)bilinearnearestlanczos3lanczos5bicubic   )r   r   >   wrapmirrorr   reflectconstant>   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 g d| jd}t
j| ||dfd} t
j| |d	} | 	|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astypejnp	tensordotexpand_dims)imagesdata_formatchannels_axisoriginal_dtypecompute_dtypergb_weights r/   O/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/backend/jax/image.pyrgb_to_grayscale/   s$   



r1   c           	      C   s   t | } | j}t|}|dkrdnd}t| jdvr#td| j t|s2tdt| t	
|j}t	t	| |k d| } t	| d|\}}}t	||}t	||}t	||}d	d
 }t	j|||||d} | S )Nr   r   r   r   r   CInvalid images dtype: expected float dtype. Received: images.dtype=        r   c                 S   s   t t | ||}t t | ||}|| }t |dk|d}t |dk|d}t |dk|| d}dd|  }	t ||k|	||   d |	| |  d }
t || k|	||  |
}
t |dk|
d|
dk |
j }
|
||fS )Nr         ?r3         @gUUUUUU?gUUUUUU?)r&   maximumminimumwherer%   r   )rgbvaluer7   range_
safe_value
safe_range
saturationnormhuer/   r/   r0   rgb_planes_to_hsv_planes_   s   "
z,rgb_to_hsv.<locals>.rgb_planes_to_hsv_planesr   )r   r   r   r   r    r!   r"   is_float_dtypestandardize_dtyper&   finfoepsr8   abssplitsqueezestack)	r)   r*   r   r+   rG   redgreenbluerC   r/   r/   r0   
rgb_to_hsvG   s6   

rO   c                 C   s   t | } | j}t|}|dkrdnd}t| jdvr#td| j t|s2tdt| t	
| d|\}}}t	||}t	||}t	||}dd	 }t	j|||||d
} | S )Nr   r   r   r   r   r2   r   c                 S   s   t | dd }t t |d d dd}t dt |d  dd}t dt |d  dd}d| }||||   }||||   }	||||   }
||	|
fS )Nr4   r5   g      @r3   g       @g      @)r&   modcliprH   )rB   r@   r<   dhdrdgdbone_minus_srL   rM   rN   r/   r/   r0   hsv_planes_to_rgb_planes   s   
z,hsv_to_rgb.<locals>.hsv_planes_to_rgb_planesr   )r   r   r   r   r    r!   r"   rD   rE   r&   rI   rJ   rK   )r)   r*   r   r+   rB   r@   r<   rW   r/   r/   r0   
hsv_to_rgby   s2   

rX   r   Fr   r3   c	              	   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krg|d	krU| jd
 f| | jd f }n| jd
 | jd f| }| jd
 }n%t| jdkr|d	kr{|| jd f }n| jd
 f| }ntd| j |rH| j}|d	kr|d |d }}n	|d |d }}tt||	 |
 }t	t
||d}tt||
 |	 }t	t
||d}tt|| d }tt|| d }|d	krt| jdkr| d d ||| ||| d d f } n| ||| ||| d d f } nt| jdkr5| d d d d ||| ||| f } n| d d ||| ||| f } n|r| j}|d	krb|d |d |d }}}n|d |d |d }}}tt||	 |
 }t	||}tt||
 |	 }t	||}tt|| d }tt|| d }|d	krM|d
krt| jdkrtjtj||||f| jd| | tj||||f| jd| gdd}ntjtj|||f| jd| | tj|||f| jd| gd
d}n|d
krJt| jdkr)tjtj||||f| jd| | tj||||f| jd| gdd}ntjtj|||f| jd| | tj|||f| jd| gdd}n| }n|d
krt| jdkrwtjt||||f| | t||||f| gdd}nbtjt|||f| | t|||f| gdd}nG|d
krt| jdkrtjt||||f| | t||||f| gdd}ntjt|||f| | t|||f| gdd}n| }|} tjj| |||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`.   zPArgument `size` must be a tuple of two elements (height, width). Received: size=r   r   r   r   r
   r   r   r   r   r   )method	antialias)r   r   RESIZE_INTERPOLATIONSr"   r    tupler!   intr$   maxminr&   concatenateonesr   jaximageresize)r)   sizeinterpolationr^   crop_to_aspect_ratiopad_to_aspect_ratio	fill_mode
fill_valuer*   target_heighttarget_width
batch_sizer!   heightwidthcrop_height
crop_widthcrop_box_hstartcrop_box_wstartchannels
pad_height	pad_widthimg_box_hstartimg_box_wstart
padded_imgr/   r/   r0   rh      s  



























rh   c                 C   s  t |}|t vrtdtt  d| |tvr'tdt d| t|}t| j	dvr:td| j	 t|j	dvrItd|j	 d	}t| j	d
kr[t
j| dd} d}t|j	dkrit
j|dd}|dkrst
| d} | j	d }t
jdd | j	dd  D ddi}t
jdd |D dd}	t
|	|ddddf}	|d d df }
|d d df }|d d df }|d d df }|jd d df |}|jd d df |}|jd d df |
}|jd d df |}t
j|ddgddggdd}t
||d
d
f}|d d dddf }t
j|ddgddggd}|jd d dddf d}t
d|	|}t
j|ddd}|t
j|g |j	dddR d7 }tjtjjjt| ||d}t|| |}|dkrrt
|d }|r|t
j|dd}|S )!NrY   rZ   8Invalid value for argument `fill_mode`. Expected of one . Received: fill_mode=r   r   )r
   r[   zInvalid transform rank: expected rank 1 (single transform) or rank 2 (batch of transforms). Received input with shape: transform.shape=Fr   r   r   Tr
   channels_firstr   r[   r   r
   c                 S   s   g | ]}t |qS r/   )r&   arange).0ri   r/   r/   r0   
<listcomp>  s    z$affine_transform.<locals>.<listcomp>indexingijc                 S   s   g | ]	}t j|d dqS )r   r   )r&   r(   )r   xr/   r/   r0   r     s    r   r[   r      )rz   constant_values)rz   zBhwij, Bjk -> Bhwik)sourcedestination)r!   ordermodecvalr   r   r
   r[   )r   r   AFFINE_TRANSFORM_INTERPOLATIONSkeysr"   setAFFINE_TRANSFORM_FILL_MODESr   r    r!   r&   r(   	transposemeshgridrd   tileatpadreshapeeinsummoveaxis	functoolspartialrf   scipyndimagemap_coordinatesvmaprJ   )r)   	transformrj   rm   rn   r*   need_squeezerq   r   indicesa0a2b1b2offsetcoordinates_map_coordinatesaffinedr/   r/   r0   affine_transform  s   


&
r   c                    s*  t |}t vrtdtt  d t| jdvr(td| j |jdd  dks6|jdvr>td|j |jdd  dksL|jdvrTtd	|j |j|jkrftd
|j d|j d}t| jdkrxt	j
| dd} d}t|jdkrt	j
|dd}t|jdkrt	j
|dd}|dkrt	| d} | j\}}tt	j|ddt	j|dd}t	jt	t	dd\}	}
t	j|	 |
 t	|	 gddfdd}t||} fdd}tj|dd| |}t	|dd}|dkr	t	|d }|rt	j|dd}|S )!NrY   rZ   r   r   r\   )r   r[   )r[   r   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   Tr[   r   r   float32r   xy)r   c                    s   | d  d  | d  d   d }| d  d  | d  d   | d  | }| d  d  | d  d   | d	  | }t j||gdd
S )N   r      r
   r4   r[   r   r   r   r   )r&   rK   )r   denomx_iny_in)gridr/   r0   transform_coordinates3  s   $&&z4perspective_transform.<locals>.transform_coordinatesc                    s0    fdd}t j|ddt| ddS )Nc                    s$   t jjj|  t ddS )Nr   r   )rf   r   r   r   r   r   )channel_img)coordsrn   rr   rj   rs   r/   r0   interpolate_channel@  s   zMperspective_transform.<locals>.interpolate_image.<locals>.interpolate_channelr   in_axesr   )rf   r   r&   r   )rg   r   r   )rn   rr   rj   rs   )r   r0   interpolate_image?  s   	z0perspective_transform.<locals>.interpolate_image)r   r   r   r
   r   r   )r   r   r   r   r"   r   r    r!   ndimr&   r(   r   compute_homography_matrixasarrayr   r   rK   ravel	ones_likerf   r   r   rJ   )r)   start_points
end_pointsrj   rn   r*   r   _
transformsr   yr   transformed_coordsr   outputr/   )rn   r   rr   rj   rs   r0   perspective_transform  s   

 &

r   c              
   C   s   | d | d }}|d |d }}t |}t |}t j||||||| | | | gdd}t j||||||| | | | gdd}	t j||	gdd}
t jt j||gdddd}t j|
|}|dS )N).r   ).r
   r   r   r
   )	r&   
zeros_liker   rK   rd   r(   linalgsolverJ   )r   r   start_xstart_yend_xend_yzerosre   x_rowsy_rowscoefficient_matrixtarget_vectorhomography_matrixr/   r/   r0   r   Z  sD   




r   c                 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r?tdtt d| |tdvrQtddd	g d
| tj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 r[   zOInvalid coordinates rank: expected at least rank 2. Received input with shape: z8Invalid value for argument `fill_mode`. Expected one of r   z4Invalid value for argument `order`. Expected one of r
   z. Received: order=)r   r!   r    r"   MAP_COORDINATES_FILL_MODESr   rangerf   r   r   r   )inputsr   r   rm   rn   r/   r/   r0   r     sF   
r   r   r   r4   r4   c           
      C   s   dd }t | } t| j}t ||d}t| jdvr#td| j d}| jdkr3| tj	df } d	}|d
kr=t
| d} | jd }||||}t||dddf}tjj| |ddd|d}	|d
krht
|	d}	|rp|	jdd}	|	S )Nc                    s>   fdd  fdd}|| |t jt jd d d d f }|S )Nc                    sH   t j|  dt j| d d  d }t d|| d  }|t | S )Nr   r
   r[   g      )r&   r   arrayexpsum)ri   sigmar   kernel1dr   r/   r0   _get_gaussian_kernel1d  s
   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel1dc                    s0    | d |d } | d |d }t ||S )Nr   r
   )r&   outer)ri   r   
kernel1d_x
kernel1d_y)r   r/   r0   _get_gaussian_kernel2d  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel2d)r&   newaxis)kernel_sizer   r   r   kernelr/   )r   r   r0   _create_gaussian_kernel  s   z.gaussian_blur.<locals>._create_gaussian_kernelr   r   r   Fr   .Tr   r   r
   )r
   r
   SAME)NCHWOIHWr   )window_stridespaddingdimension_numbersfeature_group_countr   r   r   )r   r   rE   r   r    r!   r"   r   r&   r   r   r   rf   laxconv_general_dilatedrJ   )
r)   r   r   r*   r   r   r   num_channelsr   blurred_imagesr/   r/   r0   gaussian_blur  s@   

	r         4@      @r   c                    s  t |}t vrtdtt  d tvr'tdt d tjdvr6tdj t	t	|}t	|}j
}td| dB td| dB f}	d	}
tjd
krgtjddd}
|dkruj\}}}}d}n	j\}}}}d}t|}tjj||||f|d| }tjj||||f|d| }ttj||d|	||f|d}ttj||d|	||f|d}t|}t|}tt|t|\}}|d d d d d f |d d d d d f }}|||   |||  t}|dkr&t|D ]|jdf t fddt|D }qn,t|D ]'|jd d d d d d f t fddt|D }q*|
r\tj|dd}||}|S )NrY   rZ   r~   r   r   r   r   r
   Fr   r   r   Tr   r   )r!   r   )r   r   r*   .c              	      s8   g | ]}t |d f |  | gt dqS .)r   rm   rn   r   r   r   r;   distorted_xdistorted_yrm   rn   ir)   rj   r/   r0   r   @      
z%elastic_transform.<locals>.<listcomp>c              	      s8   g | ]}t |d f |  | gt dqS r   r   r   r   r/   r0   r   R  r   )r   r   r   r   r"   r   r   r    r!   r   r   ra   r&   r(   r   rf   randomnormalr   rJ   r   r   r   r   r   rK   r%   )r)   alphar   rj   rm   rn   seedr*   input_dtyper   r   rq   rr   rs   rx   channel_axisdxdyr   r   transformed_imagesr/   r   r0   elastic_transform  s   


 

.




r
  Tc              	   C   sL   |t vrtdt  d| t| } t|}t|}tj| ||||||S )Nz5Invalid value for argument `method`. Expected of one z. Received: method=)SCALE_AND_TRANSLATE_METHODSr"   r   rf   rg   scale_and_translate)r)   output_shapescaletranslationspatial_dimsr]   r^   r/   r/   r0   r  h  s(   	r  )N)r   FFFr   r3   N)r   r   r   N)r   r   N)r   r3   )r   r   N)r   r   r   r   r3   NN)T)r   rf   	jax.numpynumpyr&   	keras.srcr   keras.src.backend.jax.corer   keras.src.random.seed_generatorr   r_   r   r   r   r  r1   rO   rX   rh   r   r   r   r   r   r
  r  r/   r/   r/   r0   <module>   sd    


2+
 v
f
e.
"
A
 	