o
    bi                     @   sX  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 Zdd Zdd Zdd Zdd  Zd!d" Zeeeed#d$ d%d$ d&Zd'd( Z			 	d?d)d*Z		 	d@d+d,Zd-d. Z	dAd/d0Z	dBd3d4Z 	5	6		7			dCd8d9Z!	:dDd;d<Z"dS )E    N)backend)convert_to_tensor)	draw_seed)scipy)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
j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nparray	tensordotexpand_dims)imagesdata_formatchannels_axisoriginal_dtypecompute_dtypergb_weights
grayscales r3   Q/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/backend/numpy/image.pyrgb_to_grayscale.   s    


r5   c           	      C   s   t | } t| j}t|}|dkrdnd}t| jdvr&td| j t|s2td| 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         ?r7         @gUUUUUU?gUUUUUU?)r(   maximumminimumwherer'   r   )rgbvaluer;   range_
safe_value
safe_range
saturationnormhuer3   r3   r4   rgb_planes_to_hsv_planes\   s   "
z,rgb_to_hsv.<locals>.rgb_planes_to_hsv_planesr   )r   r   standardize_dtyper   r!   r"   r#   r$   is_float_dtype	ml_dtypesfinfoepsr(   r<   abssplitsqueezestackr'   )	r,   r-   r   r.   rL   redgreenbluerG   r3   r3   r4   
rgb_to_hsvD   s6   


rT   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   r6   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 )Nr8   r9         @r7          @      @)r(   modcliprM   )rF   rD   r@   dhdrdgdbone_minus_srQ   rR   rS   r3   r3   r4   hsv_planes_to_rgb_planes   s   
z,hsv_to_rgb.<locals>.hsv_planes_to_rgb_planesr   )r   r   r   r!   r"   r#   r$   rI   rH   r(   rN   rO   rP   r'   )r,   r-   r   r.   rF   rD   r@   r_   r3   r3   r4   
hsv_to_rgbv   s2   


r`   r   Fr   r7   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rb|d	krU| jd
 f| | jd f }n2| jd
 | jd f| }n%t| jdkr|d	krv|| jd f }n| jd
 f| }ntd| j |rB| 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r/| d d d d ||| ||| f } n| d d ||| ||| f } n|r| j}| jd
 }|d	kra|d |d |d }}}n|d |d |d }}}tt||	 |
 }t	||}tt||
 |	 }t	||}tt|| d }tt|| d }|d	krL|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rIt| 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rvt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| |||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   _resize)r,   sizeinterpolationrf   crop_to_aspect_ratiopad_to_aspect_ratio	fill_mode
fill_valuer-   target_heighttarget_widthr#   heightwidthcrop_height
crop_widthcrop_box_hstartcrop_box_wstart
batch_sizechannels
pad_height	pad_widthimg_box_hstartimg_box_wstart
padded_imgr3   r3   r4   resize   s  




























r   c                 C   s
  t ||}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 j	j
 kt |t |dk|dd}| d }t t |	d	k|	|kt jd d f |dS )
Nr8   r         ?r   T)r    keepdimsg     @@r         )r(   r%   r:   arangerM   newaxissumr<   rK   float32rL   dividelogical_and)
input_sizeoutput_sizescaletranslationkernelrf   r   	inv_scalekernel_scalesample_fxweightstotal_weight_suminput_size_minus_0_5r3   r3   r4   _compute_weight_mat  sD   r   c                    s   |dkr	t  S t|d }|d u rtdt fddttD } fdd|D }t ||dgt| ||S )Nr   zUnknown resize methodc                 3   s&    | ]} j | | kr|V  qd S Nr#   .0iimager#   r3   r4   	<genexpr>  s    z_resize.<locals>.<genexpr>c                    s0   g | ]} j | d kr|  j |  ndqS )r   r8   r   )r   dr   r3   r4   
<listcomp>  s    "z_resize.<locals>.<listcomp>r7   )_resize_nearest_kernelsgetr$   rh   ranger"   _scale_and_translate)r   r#   re   rf   r   spatial_dimsr   r3   r   r4   rn     s(   

rn   c                    s   | j  t fddtt D }|D ]5} | | }}tj|tjdd | | }t|tj	}t
d gt  }|||< | t| } q| S )Nc                 3   s$    | ]} | | kr|V  qd S r   r3   r   input_shapeoutput_shaper3   r4   r     s    z"_resize_nearest.<locals>.<genexpr>r   r   )r#   rh   r   r"   r(   r   r   floorr'   int32slice)r   r   r   r   mnoffsetsindicesr3   r   r4   r     s   
r   c                 C   s   t ddt |  S Nr   r   )r(   r:   rM   r   r3   r3   r4   _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      @r8   r   rW   rV   r7   )r(   r<   )r   outr3   r3   r4   _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   rc   r   r7   )r(   sinpir<   r   )radiusr   yr   r3   r3   r4   _fill_lanczos_kernel  s
   (.r   c                 C   
   t d| S )NrU   r   r   r3   r3   r4   <lambda>     
 r   c                 C   r   )N      @r   r   r3   r3   r4   r     r   )r   r   r   r
   r   r	   c                 C   s   | j }t|dkr| S t| jtjr| tj}d}	n|  }d}	t	|D ]4\}
}|| j
 }|| || }}t||||
 ||
 |||j}tj|||dfd}t|d|}q&|	rqtt||  |  }|| j}|S )Nr   TFr   r   )r#   r"   r(   
issubdtyper   integerr'   r   copy	enumeratendimr   r*   moveaxisrY   roundrk   rj   )r   r   r   r   r   r   rf   r   outputuse_roundingr   r   r   r   wr3   r3   r4   r     s,   
r   c                    s  t |}t vrtdtt  d tvr'tdt d tt|}tj	dvr>tdj	 t|j	dvrMtd|j	 t 
j}t |d	}|||}d
}tj	dkrutjddd}t|j	dkrtj|dd}|dkrt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  }||d d df< ||d d df< ||d d df< ||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}d|d d dddf< td|| tj ddd  t|g |j	dddR 7  tj fddt|	D dd}|dkrt|d }|rtj|dd}||S )!Nra   rb   8Invalid value for argument `fill_mode`. Expected of one . Received: fill_mode=r   r   )r   rc   zInvalid transform rank: expected rank 1 (single transform) or rank 2 (batch of transforms). Received input with shape: transform.shape=r   Fr   r   r   Tr   channels_firstr   rc   r   r   c                 S   s   g | ]}t |qS r3   )r(   r   )r   ro   r3   r3   r4   r   X  s    z$affine_transform.<locals>.<listcomp>indexingijc                 S   s   g | ]	}t j|d dqS )r   r   )r(   r+   )r   r   r3   r3   r4   r   [  s    r   rc   r      )r   constant_values)r   zBhwij, Bjk -> Bhwik)sourcedestinationc              	      s*   g | ]}t |  | t d qS )orderrs   rt   map_coordinatesAFFINE_TRANSFORM_INTERPOLATIONSr   coordinatesrs   rt   r,   rp   r3   r4   r   w  s    r   r   r   rc   )r   r!   r   keysr$   setAFFINE_TRANSFORM_FILL_MODESr   r"   r#   rH   r   r%   r'   r(   r+   	transposemeshgridrl   tiler   padreshapeeinsumr   rP   r   rO   )r,   	transformrp   rs   rt   r-   input_dtyper0   need_squeezer}   r   r   a0a2b1b2offsetaffinedr3   r   r4   affine_transform  s   




$


r   c           !   	   C   s  t |}t|}t|}|tvrtdt d| t| jdvr*td| j |jdvs8|jdd  dkr@td|j |jdvsN|jdd  dkrVtd	|j |j|jkrhtd
|j d|j | j}|dkrt| 	d} 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} | j\}}	}
}t||}t|jdkrt
j|dd}|jd dkr|dkrt
||df}t
jt
j|
t
jdt
j|	t
jddd\}}t
||	|
|f}t|D ]p}|| \}}}}}}}}|| ||  d }|| ||  | | }|| ||  | | }t
j| | gdd}g }t|D ]#}| |d d d d |f }t||t| d|d} || |	|
 q?t
j|dd||< q|dkrxt
|d}|rt
j|dd}|	|}|S )Nra   rb   r   r   )rc   r   rd   )r   rc   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=float16r   Fr   r   r   Trc   r   r   r   r   xy)r   r8   r   r   r   r   )r   r!   r   r   r$   r"   r#   r   r   r'   r(   r+   r   compute_homography_matrixr   r   r   r   emptyr   rP   ravelr   appendr   rO   )!r,   start_points
end_pointsrp   rt   r-   r   r   r}   rw   rx   r~   
transformsr   r   r   r   r   a1r   a3a4a5a6a7denomx_iny_incoordsmapped_channelschannelchannel_imgmapped_channelr3   r3   r4   perspective_transform  s   





r
  c                 C   s  t | } t |}t| j|jt}t|d}| |} ||}| 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   r   r   rc   r   r   r      )r   r   r%   r   r&   r'   r(   rP   	ones_like
zeros_liker+   linalgsolver   )r   r   r   r0   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_matrixr3   r3   r4   r     s  

&&&&&&&&







jn



r   c           
      C   sH  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dvrStddd	g d
| dd t|| jD }dd t||D }dddd	||}|dkrt
j| |||d}nt
j| ||d}t|jr|d}tjj|||||d}	|	| 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 rc   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=c                 S   sR   g | ]%\}}t t| t d  dt t|  td  | dfqS )r   r   )rj   r(   r   rk   r'   ri   ceil)r   cro   r3   r3   r4   r     s     z#map_coordinates.<locals>.<listcomp>c                 S   s   g | ]
\}}||d   qS )r   r3   )r   pr$  r3   r3   r4   r     s    edger   	symmetric)r   r   r   r   )moder   r(  r   )r   r(  cval)r   r#   r"   r$   MAP_COORDINATES_FILL_MODESr   r   r   zipr   r(   r   r   rI   r   r'   r   ndimager   )
inputsr   r   rs   rt   paddingshifted_coordspad_modepaddedresultr3   r3   r4   r     sj   



r   r   r   r8   r8   c                 C   s  dd }t | } t |}t |}t| j}t|d}| |} ||}t| jdvr5td| j d}t| jdkrGt	j
| dd	} d
}|dkrQt	| d} | j\}}	}
}|||||}|d d }|d d }t	| }t|D ]=}t|D ]6}t	j| |d d d d |f ||f||ffdd}tjj||d d d d |f dd||d d d d |f< qzqt|dkrt	|d}|rt	j|dd	}||S )Nc                    sX   fdd  fdd}|| |}|d d d d t jf }t |dd|f}|S )Nc                    s>   t j|  d| d d  }t d|| d  }|t | S )Nr   r   rc   r   )r(   r   expr   )ro   sigmar   kernel1dr   r3   r4   _get_gaussian_kernel1d  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel1dc                    s<   t | }  | d |d } | d |d }t ||S r   )r(   asarrayouter)ro   r7  
kernel1d_x
kernel1d_yr9  r   r3   r4   _get_gaussian_kernel2d  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel2dr   )r(   r   r   r'   )kernel_sizer7  num_channelsr   r?  r   r3   r>  r4   _create_gaussian_kernel  s   

z.gaussian_blur.<locals>._create_gaussian_kernelr   r   r   Fr   r   r   Tr   r   rc   r   r   r)  validr   )r   r   rH   r   r%   r'   r"   r#   r$   r(   r+   r   
empty_liker   r   r   signal
convolve2drO   )r,   r@  r7  r-   rB  r   r0   r   r}   rw   rx   rA  r   pad_hpad_wblurred_imagesr?   chr2  r3   r3   r4   gaussian_blur  sV   




rK        4@r   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	j
}t	||d}t	||d}td| d	B td| d	B f}	d
}
tjdkrktjddd}
|dkryj\}}}}d}n	j\}}}}d	}t|}tj|}|j|||fddd|| }|j|||fdd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r0t|D ]t fddt|D |df< qn(t|D ]#t fddt|D |d d d d d d f< q4|
rbtj|dd}||}|S )Nra   rb   r   r   r   r   r      r   Fr   r   r   Tr   r   r7   r8   )ro   locr   )r@  r7  r-   c              	      s8   g | ]}t |d f |  | gt dqS .r   r   r   r?   distorted_xdistorted_yrs   rt   r   r,   rp   r3   r4   r   o      z%elastic_transform.<locals>.<listcomp>.c              	      s8   g | ]}t |d f |  | gt dqS rO  r   rP  rQ  r3   r4   r   }  rT  )r   r!   r   r   r$   r   r   r"   r#   r   r   ri   r(   r+   r   randomdefault_rngnormalr'   rK  rO   r   r   r  r   rP   )r,   alphar7  rp   rs   rt   seedr-   r   r@  r   r}   rw   rx   r~   channel_axisrngdxdyr   r   transformed_imagesr3   rQ  r4   elastic_transform  s   


 

.

 
r_  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| ||||||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   r   r   r%   r   r'   r   )	r,   r   r   r   r   re   rf   r   r   r3   r3   r4   scale_and_translate  s8   	

rb  r   )r   FFFr   r7   N)r   r   r   N)r   r   N)r   r7   )r4  r5  N)rL  r   r   r   r7   NN)T)#rJ   numpyr(   	keras.srcr   keras.src.backend.numpy.corer   keras.src.random.seed_generatorr   keras.src.utils.module_utilsr   rg   r   r   r+  ra  r5   rT   r`   r   r   rn   r   r   r   r   r   r   r   r
  r   r   rK  r_  rb  r3   r3   r3   r4   <module>   s    


2+
 q*	
"
q
m 
>
K
 