o
    ॵim%                     @   sv  d dl Z d dlZdd Zd7ddZdd Zd8d	d
Zd9ddZdd Zdd Z	dd Z
dd Zd8ddZd8ddZd8ddZdd Zd8ddZd8d d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zeeeeeee	e
eeeeeed2Zd3Zd3Zd4Zeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed2ZG d5d6 d6eZ dS ):    Nc                 C   s   | S N )imgr   r   d/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/preprocessors/ofa/utils/vision_helper.pyidentity_func
      r   c                    s8   d fddfddt | D }t |}|S )z6
        same output as PIL.ImageOps.autocontrast
       c           	         s8  | j } | d }|dkr|  |  }}nGt| gdgd gdg}tt||k}|jd dkr8dn|d }tt|d d d |k}|jd dkrVd nd |d  }||krht	}n&d ||  }| | }t	| | }d||dk < d ||d k< |
ddtj}||  S )Nd   r         )sizemaxmincv2calcHistnpargwherecumsumshapearangeclipastypeuint8)	chncuthighlowhisttablescaleoffset)cutoffn_binsr   r   tune_channel   s$   &
z'autocontrast_func.<locals>.tune_channelc                       g | ]} |qS r   r   .0r   r%   r   r   
<listcomp>*       z%autocontrast_func.<locals>.<listcomp>r   splitmerge)r   r#   channelsoutr   )r#   r$   r%   r   autocontrast_func   s
   
r1   c                    s6   d  fddfddt | D }t |}|S )zn
        same output as PIL.ImageOps.equalize
        PIL's implementation is different from cv2.equalize
    r   c                    s   t | gdgd  gd g}||dk d}t|d d  d  }|dkr*| S t|}|d |d< |d d |dd < t|| ddtj	}||  S )Nr   r
   r      r   )
r   r   reshaper   sum
empty_liker   r   r   r   )r   r   non_zero_histstepr   r    )r$   r   r   r%   6   s   
z#equalize_func.<locals>.tune_channelc                    r&   r   r   r'   r)   r   r   r*   B   r+   z!equalize_func.<locals>.<listcomp>r,   )r   r/   r0   r   )r$   r%   r   equalize_func/   s
   
r8   r   r   r   c                 C   sN   | j d | j d }}|d |d f}t||d}tj| |||f|d}|S )z1
    like PIL, rotate by degree, not radians
    r   r   r2   )borderValue)r   r   getRotationMatrix2D
warpAffine)r   degreefillHWcenterMr0   r   r   r   rotate_funcG   s
   rC      c                    s<   t  fddtdD }|ddt j}||  }|S )3
        same output as PIL.ImageOps.posterize
    c                    s    g | ]}| k r
|nd | qS )r   r   r(   elthreshr   r   r*   V   s     z!solarize_func.<locals>.<listcomp>r   r   r   )r   arrayranger   r   r   )r   rI   r    r0   r   rH   r   solarize_funcR   s   rL   c                 C   sV   t g dg dg dg| t dgdgdgg }t | |ddt j}|S )	N)g'1Z?v/rM   )bX9g;On?rN   )A`"ӿrO   g;On?v/?bX9?A`"?r   r   )r   float32matmulr   r   r   )r   factorrB   r0   r   r   r   
color_func\   s   rV   c                    s\   t t j| ddt g d t  fddtdD ddt j}||  }|S )	6
        same output as PIL.ImageEnhance.Contrast
    )r   r   )axis)rP   rQ   rR   c                    s   g | ]
}|    qS r   r   rF   rU   meanr   r   r*   k   s    z!contrast_func.<locals>.<listcomp>r   r   r   )r   r4   rZ   rJ   rK   r   r   r   r   rU   r    r0   r   rY   r   contrast_funcf   s   "r\   c                 C   s0   t jdt jd| ddt j}||  }|S )rW   r   dtyper   r   )r   r   rS   r   r   r   r[   r   r   r   brightness_funcq   s
   r_   c                 C   s   t jdt jd}d|d d< |d }t| d|}|dkr!|}|S |dkr)| }|S | t j}|t jddddd	d	f }|||ddddd	d	f |   |ddddd	d	f< |t j}|S )
zl
    The differences the this result and PIL are all on the 4 boundaries, the center
    areas are same
    )   r`   r]      r      r
   g        g      ?N)r   onesrS   r   filter2Dr   r   )r   rU   kernel
degenerater0   r   r   r   sharpness_func{   s"   	"rg   c                 C   sT   | j d | j d }}td|dgg dg}tj| |||f|tjdtj}|S )Nr   r   r   r   r   r:   flagsr   r   rS   r   r<   INTER_LINEARr   r   r   rU   r>   r?   r@   rB   r0   r   r   r   shear_x_func      rn   c                 C   sV   | j d | j d }}tdd| gg dg}tj| |||f|tjdtj}|S )0
        same output as PIL.Image.transform
    r   r   rh   ri   rk   r   r"   r>   r?   r@   rB   r0   r   r   r   translate_x_func      rr   c                 C   sV   | j d | j d }}tg ddd| gg}tj| |||f|tjdtj}|S )rp   r   r   r   r   r   ri   rk   rq   r   r   r   translate_y_func   rs   ru   c                 C   s   t | t dd| > }|S )rE   r      )r   bitwise_andr   )r   bitsr0   r   r   r   posterize_func   s   ry   c                 C   sT   | j d | j d }}tg d|ddgg}tj| |||f|tjdtj}|S )Nr   r   rt   ri   rk   rm   r   r   r   shear_y_func   ro   rz   c                 C   s   t j|t jd}| jd | jd }}t jd\}}|d }t|| t|| }}t|| dt|| |}	}
t|| dt|| |}}|  }|||	|
||d d f< |S )Nr]   r   r   r2   )	r   rJ   r   r   randomintr   r   copy)r   pad_sizereplacer?   r@   rhrwr   cwx1x2y1y2r0   r   r   r   cutout_func   s   r   c                        fdd}|S )Nc                    s   |   d d fS )Ng?g?r   level	MAX_LEVELr   r   level_to_args   s   z,enhance_level_to_args.<locals>.level_to_argsr   r   r   r   r   r   enhance_level_to_args   s   r   c                        fdd}|S )Nc                    s(   |   d } t j dkr|  } | fS )Ng333333?      ?r   r{   r   r   replace_valuer   r   r         z*shear_level_to_args.<locals>.level_to_argsr   r   r   r   r   r   r   shear_level_to_args      r   c                        fdd}|S )Nc                    s,   |   t  } tj dkr|  } | fS )Nr   )floatr   r{   r   r   r   translate_constr   r   r      s   z.translate_level_to_args.<locals>.level_to_argsr   )r   r   r   r   r   r   r   translate_level_to_args   s   r   c                    r   )Nc                    s   t |    } | fS r   r|   r   r   cutout_constr   r   r   r      s   z+cutout_level_to_args.<locals>.level_to_argsr   )r   r   r   r   r   r   r   cutout_level_to_args   s   r   c                    r   )Nc                       t |   d } | fS )Nr   r   r   r   r   r   r         z-solarize_level_to_args.<locals>.level_to_argsr   r   r   r   r   solarize_level_to_args      r   c                 C   s   dS )Nr   r   r   r   r   r   none_level_to_args  r   r   c                    r   )Nc                    r   )N   r   r   r   r   r   r     r   z.posterize_level_to_args.<locals>.level_to_argsr   r   r   r   r   posterize_level_to_args  r   r   c                    r   )Nc                    s(   |   d } t j dk r|  } | fS )N   r   r   r   r   r   r   r     r   z+rotate_level_to_args.<locals>.level_to_argsr   r   r   r   r   rotate_level_to_args  r   r   )IdentityAutoContrastEqualizeRotateSolarizeColorContrast
Brightness	SharpnessShearX
TranslateX
TranslateY	PosterizeShearY
   )rD   rD   rD   c                   @   s.   e Zd Zdddg fddZdd Zdd	 Zd
S )RandomAugmentr2   r   Fc                 C   s2   || _ || _|| _|r|| _d S tt | _d S r   )NrB   isPILaugslistarg_dictkeys)selfr   rB   r   r   r   r   r   __init__O  s   
zRandomAugment.__init__c                    s$   t j j j} fdd|D S )Nc                    s   g | ]}|d  j fqS )r   )rB   )r(   opr   r   r   r*   Z  s    z0RandomAugment.get_random_ops.<locals>.<listcomp>)r   r{   choicer   r   )r   sampled_opsr   r   r   get_random_opsX  s   zRandomAugment.get_random_opsc                 C   s\   | j rt|}|  }|D ]\}}}tj |krqt| |}t| |g|R  }q|S r   )r   r   rJ   r   r{   r   	func_dict)r   r   opsnameprobr   argsr   r   r   __call__\  s   
zRandomAugment.__call__N)__name__
__module____qualname__r   r   r   r   r   r   r   r   M  s    	r   )r   )r9   )rD   )!r   numpyr   r   r1   r8   rC   rL   rV   r\   r_   rg   rn   rr   ru   ry   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   <module>   sv   
!






	


				

 