o
    2hs                     @   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d&dd	Zd&d
dZ							d'ddZd ddZh dZ			 	d(ddZh dZ		 	d)ddZdd Z	d*ddZ	d+dd Z	!	"		#			d,d$d%ZdS )-    N)backend)convert_to_tensor)	draw_seed)bilinearnearestlanczos3lanczos5bicubicc                 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&   V/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/jax/image.pyrgb_to_grayscale   s$   



r(   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         ?r*         @gUUUUUU?gUUUUUU?)r   maximumminimumwherer   r   )rgbvaluer.   range_
safe_value
safe_range
saturationnormhuer&   r&   r'   rgb_planes_to_hsv_planesC   s   "
z,rgb_to_hsv.<locals>.rgb_planes_to_hsv_planesr   )r   r   r   r   r   r   r   is_float_dtypestandardize_dtyper   finfoepsr/   abssplitsqueezestack)	r    r!   r   r"   r>   redgreenbluer:   r&   r&   r'   
rgb_to_hsv+   s6   

rF   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   r)   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 )Nr+   r,   g      @r*   g       @g      @)r   modclipr?   )r9   r7   r3   dhdrdgdbone_minus_srC   rD   rE   r&   r&   r'   hsv_planes_to_rgb_planess   s   
z,hsv_to_rgb.<locals>.hsv_planes_to_rgb_planesr   )r   r   r   r   r   r   r   r;   r<   r   r@   rA   rB   )r    r!   r   r"   r9   r7   r3   rN   r&   r&   r'   
hsv_to_rgb]   s2   

rO   r   Fconstantr*   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=rP   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   )method	antialias)r   r   RESIZE_INTERPOLATIONSr   r   tupler   intr   maxminr   concatenateonesr   jaximageresize)r    sizeinterpolationrW   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&   r'   ra      s  



























ra   rT   )r   r   >   wrapmirrorr   reflectrP   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 )!NrQ   rR   8Invalid value for argument `fill_mode`. Expected of one . Received: fill_mode=r   r   )rT   rS   zInvalid transform rank: expected rank 1 (single transform) or rank 2 (batch of transforms). Received input with shape: transform.shape=Fr   r   r   TrT   channels_firstr   rS   r   rT   c                 S   s   g | ]}t |qS r&   )r   arange).0rb   r&   r&   r'   
<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&   r'   r     s    r   rS   r      )rs   constant_values)rs   zBhwij, Bjk -> Bhwik)sourcedestination)r   ordermodecvalr   r   rT   rS   )r   r   AFFINE_TRANSFORM_INTERPOLATIONSkeysr   setAFFINE_TRANSFORM_FILL_MODESr   r   r   r   r   	transposemeshgridr]   tileatpadreshapeeinsummoveaxis	functoolspartialr_   scipyndimagemap_coordinatesvmaprA   )r    	transformrc   rf   rg   r!   need_squeezerj   r   indicesa0a2b1b2offsetcoordinates_map_coordinatesaffinedr&   r&   r'   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 )!NrQ   rR   r   r   rU   )r   rS   )rS   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   TrS   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      rT   r+   rS   r   r   r   r   )r   rB   )r   denomx_iny_in)gridr&   r'   transform_coordinates-  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 )NrP   r   )r_   r   r   r   r   r   )channel_img)coordsrg   rk   rc   rl   r&   r'   interpolate_channel:  s   zMperspective_transform.<locals>.interpolate_image.<locals>.interpolate_channelr   in_axesr   )r_   r   r   r   )r`   r   r   )rg   rk   rc   rl   )r   r'   interpolate_image9  s   	z0perspective_transform.<locals>.interpolate_image)r   r   r   rT   r   r   )r   r   r   r   r   r   r   r   ndimr   r   r   compute_homography_matrixasarrayr   r~   rB   ravel	ones_liker_   r   r   rA   )r    start_points
end_pointsrc   rg   r!   r   rj   rq   
transformsr   yr   transformed_coordsr   outputr&   )rg   r   rk   rc   rl   r'   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   ).rT   r   r   rT   )	r   
zeros_liker   rB   r]   r   linalgsolverA   )r   r   start_xstart_yend_xend_yzerosr^   x_rowsy_rowscoefficient_matrixtarget_vectorhomography_matrixr&   r&   r'   r   T  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 rS   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 rT   z. Received: order=)r   r   r   r   MAP_COORDINATES_FILL_MODESr   ranger_   r   r   r   )inputsr   r   rf   rg   r&   r&   r'   r     sF   
r   r   r   r+   r+   c           
      C   s   dd }t | } t |}| j}t| jdvrtd| j d}| jdkr.| tjdf } d}|d	kr8t| d
} | jd }||||}t	||dddf}t
jj| |ddd|d}	|d	krct|	d}	|rk|	jdd}	|	S )Nc                    s>   fdd  fdd}|| |t jt jd d d d f }|S )Nc                    s>   t j|  d| d d  }t d|| d  }|t | S )Nr   rT   rS   g      )r   r~   expsum)rb   sigmar   kernel1dr   r&   r'   _get_gaussian_kernel1d  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel1dc                    s0    | d |d } | d |d }t ||S )Nr   rT   )r   outer)rb   r   
kernel1d_x
kernel1d_y)r   r&   r'   _get_gaussian_kernel2d  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel2d)r   newaxis)kernel_sizer   r   r   kernelr&   )r   r   r'   _create_gaussian_kernel  s   z.gaussian_blur.<locals>._create_gaussian_kernelr   r   Fr   .Tr
   r   rT   )rT   rT   SAME)NCHWOIHWr   )window_stridespaddingdimension_numbersfeature_group_countr}   r   r   )r   r   r   r   r   r   r   r   r   r   r_   laxconv_general_dilatedrA   )
r    r   r   r!   r   r   r   num_channelsr   blurred_imagesr&   r&   r'   gaussian_blur  s@   

	r         4@      @ry   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 )NrQ   rR   rz   r{   r   r   r   rT   Fr   r   r   Tr
   r   )r   r   )r   r   r!   .c              	      s8   g | ]}t |d f |  | gt dqS .)r   rf   rg   r   r   r   r2   distorted_xdistorted_yrf   rg   ir    rc   r&   r'   r   8      
z%elastic_transform.<locals>.<listcomp>c              	      s8   g | ]}t |d f |  | gt dqS r   r   r   r   r&   r'   r   J  r   )r   r   r   r   r   r   r   r   r   r   r   rZ   r   r   r   r_   randomnormalr   rA   r   r~   r   r   r   rB   r   )r    alphar   rc   rf   rg   seedr!   input_dtyper   r   rj   rk   rl   rq   channel_axisdxdyr   r   transformed_imagesr&   r   r'   elastic_transform  s   


 

.




r  )N)r   FFFrP   r*   N)r   rP   r   N)r   r   N)rP   r*   )r   r   N)r   r   r   ry   r*   NN)r   r_   	jax.numpynumpyr   	keras.srcr   keras.src.backend.jax.corer   keras.src.random.seed_generatorr   rX   r(   rF   rO   ra   r   r   r   r   r   r   r   r   r  r&   r&   r&   r'   <module>   s\    
	

2+
 t
b
e.
"
?