Ë
    ÃÓ^jÐ5  ã                  ó¤  — d Z ddlm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dlmZ ddlZddlZdd	lmZmZmZmZmZ dd
lmZ ddlmZ ddlmZ ddlmZ g d¢Zedd„«       Z eedd„«       «       Z!e	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Z"dd„Z#d d„Z$eed!d„«       «       Z%d"d„Z&d#d$d„Z'd%d&d„Z(	 	 	 	 	 	 	 	 	 	 	 	 d'd„Z)d(d„Z*d%d)d„Z+d%d)d„Z,d*d„Z-y)+aO  Functional implementations of various blur operations for image processing.

This module provides a collection of low-level functions for applying different blur effects
to images, including standard blur, median blur, glass blur, defocus, and zoom effects.
These functions form the foundation for the corresponding transform classes.
é    )ÚannotationsN)ÚSequence)Úproduct)Úceil)ÚLiteral)Úwarn)ÚclippedÚ
float32_ioÚmaybe_process_in_chunksÚpreserve_channel_dimÚuint8_io)ÚValidationInfo)Úscale)Úconvolve)ÚEIGHT)Úbox_blurÚcentral_zoomÚdefocusÚ
glass_blurÚmedian_blurÚ	zoom_blurc                óL   — t        t        j                  ||f¬«      } || «      S )zÈBlur an image.

    This function applies a blur to an image.

    Args:
        img (np.ndarray): Input image.
        ksize (int): Kernel size.

    Returns:
        np.ndarray: Blurred image.

    ©Úksize)r   Úcv2Úblur©Úimgr   Úblur_fns      úw/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/albumentations/augmentations/blur/functional.pyr   r      s"   € ô &¤c§h¡h°u¸e°nÔE€GÙ�3‹<Ðó    c                óH   — t        t        j                  |¬«      } || «      S )zÝMedian blur an image.

    This function applies a median blur to an image.

    Args:
        img (np.ndarray): Input image.
        ksize (int): Kernel size.

    Returns:
        np.ndarray: Median blurred image.

    r   )r   r   Ú
medianBlurr   s      r    r   r   /   s   € ô &¤c§n¡n¸EÔB€GÙ�3‹<Ðr!   c                óà  — t        j                  t        j                  | «      |d¬«      }|dk(  rÞt        j                  | j
                  d   |z
  |d«      }t        j                  | j
                  d   |z
  |d«      }t        j                  ||j
                  d   «      }	t        j                  ||j
                  d   «      }
t        |«      D ];  }|dd…|df   }|dd…|df   }||	|z   |
|z   f   ||	|
f   c||	|
f<   ||	|z   |
|z   f<   Œ= nÉ|dk(  rµt        t        t        |«      t        | j
                  d   |z
  |d«      t        | j
                  d   |z
  |d«      «      «      D ]\  \  }\  }}	}
|t        |«      k  r|n|t        |«      z  }|||df   }|||df   }||	|z   |
|z   f   ||	|
f   c||	|
f<   ||	|z   |
|z   f<   Œ^ nt        d	|› d
�«      ‚t        j                  ||d¬«      S )a|  Glass blur an image.

    This function applies a glass blur to an image.

    Args:
        img (np.ndarray): Input image.
        sigma (float): Sigma.
        max_delta (int): Maximum delta.
        iterations (int): Number of iterations.
        dxy (np.ndarray): Dxy.
        mode (Literal["fast", "exact"]): Mode.

    Returns:
        np.ndarray: Glass blurred image.

    )r   r   )ÚsigmaXr   Úfastr   éÿÿÿÿé   NÚexactzUnsupported mode `z$`. Supports only `fast` and `exact`.)r   ÚGaussianBlurÚnpÚarrayÚarangeÚshapeÚtileÚrepeatÚrangeÚ	enumerater   ÚlenÚ
ValueError)r   ÚsigmaÚ	max_deltaÚ
iterationsÚdxyÚmodeÚxÚhsÚwsÚhÚwÚiÚdyÚdxÚindÚidxs                   r    r   r   B   s  € ô2 	×ÑœŸ™ #›¨u¸FÔC€Aàˆv‚~Ü�Y‰Y�s—y‘y ‘| iÑ/°¸BÓ?ˆÜ�Y‰Y�s—y‘y ‘| iÑ/°¸BÓ?ˆÜ Ÿg™g b¨"¯(©(°1©+Ó6ˆÜ Ÿi™i¨¨B¯H©H°Q©KÓ8ˆä�zÓ"ò 	DˆAØ’Q˜˜1�W‘ˆBØ’Q˜˜1�W‘ˆBØ)*¨1¨r©6°1°r±6¨>Ñ):¸A¸aÀ¸d¹GÐ&ˆAˆa�ˆd‰G�Q�q˜2‘v˜q 2™v�~Ò&ñ	Dð
 
�ŠÜ'ÜÜ�jÓ!Ü�c—i‘i ‘l YÑ.°	¸2Ó>Ü�c—i‘i ‘l YÑ.°	¸2Ó>óó
ò 
	D‰NˆC‘�!�Q˜ð œs 3›xš‘#¨S´3°s³8©^ˆCØ�S˜!˜Q�Y‘ˆBØ�S˜!˜Q�Y‘ˆBØ)*¨1¨r©6°1°r±6¨>Ñ):¸A¸aÀ¸d¹GÐ&ˆAˆa�ˆd‰G�Q�q˜2‘v˜q 2™v�~Ò&ñ
	Dô Ð-¨d¨VÐ3WÐXÓYÐYä×Ñ˜A e°6Ô:Ð:r!   c                ó�  — t        j                  t        d|«       t        d|«      dz   «      }|t        k  rdnd}t        j                  ||«      \  }}t        j
                  |dz  |dz  z   |dz  k  t         j                  ¬«      }|t        j                  |«      z  }t        j                  |||f|¬«      }t        | |¬«      S )	zéDefocus an image.

    This function defocuses an image.

    Args:
        img (np.ndarray): Input image.
        radius (int): Radius.
        alias_blur (float): Alias blur.

    Returns:
        np.ndarray: Defocused image.

    é   r(   é   é   é   ©Údtype)r%   )Úkernel)r+   r-   Úmaxr   Úmeshgridr,   Úfloat32Úsumr   r*   r   )	r   ÚradiusÚ
alias_blurÚlengthr   r:   ÚyÚaliased_diskrK   s	            r    r   r   z   s©   € ô �Y‰Yœ˜A˜v›�¬¨A¨v«¸Ñ(:Ó;€FØœ5’‰A a€Eä�;‰;�v˜vÓ&�D€A€qÜ—8‘8˜Q ™T A q¡D™[¨V°Q©YÑ6¼b¿j¹jÔI€LØ”B—F‘F˜<Ó(Ñ(€Lä×Ñ˜l¨U°E¨NÀ:ÔN€Fä�C Ô'Ð'r!   c                óH  — | j                   dd \  }}t        ||z  «      t        ||z  «      }}||z
  dz  ||z
  dz  }}t        | |||z   …|||z   …f   |t        j                  «      } | j                   d   |z
  dz  | j                   d   |z
  dz  }	}| |||z   …|	|	|z   …f   S )zÉCentral zoom an image.

    This function zooms an image.

    Args:
        img (np.ndarray): Input image.
        zoom_factor (int): Zoom factor.

    Returns:
        np.ndarray: Zoomed image.

    NrH   r   r(   )r.   r   r   r   ÚINTER_LINEAR)
r   Úzoom_factorÚheightÚwidthÚh_chÚw_chÚh_topÚw_topÚ
h_trim_topÚ
w_trim_tops
             r    r   r   ”   sÑ   € ð —I‘I˜b˜q�M�M€FˆEÜ�f˜{Ñ*Ó+¬T°%¸+Ñ2EÓ-Fˆ$€DØ˜T‘M aÑ'¨%°$©,¸1Ñ)<ˆ5€Eä
��E˜E D™LÐ(¨%°%¸$±,Ð*>Ð>Ñ?ÀÌc×N^ÑN^Ó
_€CØ!Ÿi™i¨™l¨VÑ3¸Ñ9¸C¿I¹IÀa¹LÈ5Ñ<PÐUVÑ;V�
€JØˆz˜J¨Ñ/Ð/°¸jÈ5Ñ>PÐ1PÐPÑQÐQr!   c                ó    — t        j                  | t         j                  ¬«      }|D ]  }|t        | |«      z  }Œ | |z   t	        |«      dz   z  S )zõZoom blur an image.

    This function zooms and blurs an image.

    Args:
        img (np.ndarray): Input image.
        zoom_factors (np.ndarray | Sequence[int]): Zoom factors.

    Returns:
        np.ndarray: Zoomed and blurred image.

    rI   r(   )r+   Ú
zeros_likerN   r   r3   )r   Úzoom_factorsÚoutrW   s       r    r   r   ª   sS   € ô �-‰-˜¤2§:¡:Ô
.€Cà#ò .ˆØŒ|˜C Ó-Ñ-‰ð.ð �#‰Iœ#˜lÓ+¨aÑ/Ñ0Ð0r!   c           
     ó¢   — | d   |k  s| d   |k  r>t        || d   «      t        || d   «      f}t        |› d| › d|› d|› d�t        d¬«       |S | S )	Nr   r(   z: Invalid kernel size range z. Values less than z2 are not allowed. Range automatically adjusted to ú.rH   ©Ú
stacklevel)rL   r   ÚUserWarning)ÚresultÚ	min_valueÚ
field_nameÚ
new_results       r    Ú_ensure_min_valuerm   Á   s}   € Øˆa�y�9Ò  q¡	¨IÒ 5Ü˜) V¨A¡YÓ/´°YÀÀqÁ	Ó1JÐKˆ
ÜØˆlÐ6°v°hð ? Ø )˜{ð +/Ø/9¨l¸!ð=ô Øõ	
ð ÐØ€Mr!   c                óÆ   — | d   dk(  s| d   dz  dk(  r| d   n| d   dz   | d   dk(  s| d   dz  dk(  r| d   n| d   dz   f}|| k7  rt        |› d| › d|› d�t        d¬«       |S )Nr   rH   r(   z+: Non-zero kernel sizes must be odd. Range z automatically adjusted to re   rf   )r   rh   )ri   rk   rl   s      r    Ú_ensure_odd_valuesro   Ï   s˜   € à˜A‘Y !’^ v¨a¡y°1¡}¸Ò'9ˆˆqŠ	¸vÀa¹yÈ1¹}Ø˜A‘Y !’^ v¨a¡y°1¡}¸Ò'9ˆˆqŠ	¸vÀa¹yÈ1¹}ð€Jð �VÒÜØˆlÐEÀfÀXÐMhÐisÐhtÐtuÐvÜØõ	
ð
 Ðr!   c                ó~  — t        | t        «      r6t        | «      dk7  rt        d«      ‚t	        | d   «      t	        | d   «      f}n|t	        | «      f}t        |||j                  «      }t        ||j                  «      }|d   |d   kD  r1|d   |d   f}t        |j                  › d|› d|› d�t        d¬«       |S |S )	z0Process blur limit to ensure valid kernel sizes.rH   z(Sequence must contain exactly 2 elementsr   r(   z: Invalid range z. (min > max). Range automatically adjusted to re   rf   )
Ú
isinstancer   r3   r4   Úintrm   rk   ro   r   rh   )ÚvalueÚinforj   ri   Úfinal_results        r    Úprocess_blur_limitrv   Ý   sÌ   € ô �%œÔ"Üˆu‹:˜Š?ÜÐGÓHÐHÜ�e˜A‘h“-¤ U¨1¡X£Ð/‰àœS ›ZÐ(ˆä˜v y°$·/±/ÓB€FÜ ¨¯©Ó8€Fàˆa�y�6˜!‘9ÒØ˜q™	 6¨!¡9Ð-ˆÜØ�‰ÐÐ/°¨xÐ7eÐfrÐesÐstÐuÜØõ	
ð
 Ðà€Mr!   c                ó:  — t        j                  |dd«      }t        j                  | | ft         j                  ¬«      }| dz  }t        j                  |«      }t        j
                  |«      }t        j                  |«      }	| dz  }
|dk  r t        |«      }t        |
 «      }|
d|z
  z  }n3|dkD  r|}|
 d|z
  z  }t        |
«      }nt        |
 «      }t        |
«      }t        j                  ||| «      }|||z  z   }||	|z  z   }|r:|j                  dd«      |
z  dz  }|j                  dd«      |
z  dz  }||z  }||z  }t        j                  t        j                  |«      d| dz
  «      j                  t        «      }t        j                  t        j                  |«      d| dz
  «      j                  t        «      }t        j                  t        j                  ||g«      d¬«      }d||d	d	…df   |d	d	…df   f<   |j!                  «       sd|||f<   |S )
a¦  Create a motion blur kernel.

    Args:
        kernel_size (int): Size of the kernel (must be odd)
        angle (float): Angle in degrees (counter-clockwise)
        direction (float): Blur direction (-1.0 to 1.0)
        allow_shifted (bool): Allow kernel to be randomly shifted from center
        random_state (random.Random): Python's random.Random instance

    Returns:
        np.ndarray: Motion blur kernel

    g      ð¿g      ð?rI   rH   r   r(   r'   )ÚaxisN)r+   ÚclipÚzerosrN   Údeg2radÚcosÚsinÚabsÚfloatÚlinspaceÚuniformÚroundÚastyperr   ÚuniqueÚcolumn_stackÚany)Úkernel_sizeÚangleÚ	directionÚallow_shiftedÚrandom_staterK   ÚcenterÚ	angle_radrA   r@   Úline_lengthÚbias_factorÚt_startÚt_endÚtr:   rS   Úshift_xÚshift_yÚpointss                       r    Úcreate_motion_kernelr–   ö   s  € ô* —‘˜	 4¨Ó-€Iä�X‰X�{ KÐ0¼¿
¹
ÔC€FØ˜AÑ€Fô —
‘
˜5Ó!€Iô 
�‰�	Ó	€BÜ	�‰�	Ó	€Bð  Ñ"€Kð �1‚}ô ˜)“nˆÜ˜˜Ó%ˆØ˜q ;™Ñ/‰Ø	�QŠð  ˆØ�, ! k¡/Ñ2ˆÜ�kÓ"‰ô ˜˜Ó%ˆÜ�kÓ"ˆô 	�‰�G˜U KÓ0€Að 	��a‘‰€AØ��a‘‰€Añ Ø×&Ñ& r¨1Ó-°Ñ;¸aÑ?ˆØ×&Ñ& r¨1Ó-°Ñ;¸aÑ?ˆØ	ˆW‰ˆØ	ˆW‰ˆô 	�‰”—‘˜“˜Q ¨a¡Ó0×7Ñ7¼Ó<€AÜ
�‰”—‘˜“˜Q ¨a¡Ó0×7Ñ7¼Ó<€Aô �Y‰Y”r—‘¨¨1 vÓ.°QÔ7€FØ)*€Fˆ6’!�Q�$‰<˜¢ 1 ™Ð%Ñ&ð �:‰:Œ<Ø!"ˆˆv�vˆ~Ñà€Mr!   c                óÌ   — t        d||dz  dk(  z   «      }t        d||dz  dk(  z   «      }t        ||«      }||k(  r|S ||z
  dz  dz   }| j                  d|dz
  «      }|d|z  z   S )ab  Sample an odd number from the range [low, high] (inclusive).

    Args:
        random_state (random.Random): instance of random.Random
        low (int): lower bound (will be converted to nearest valid odd number)
        high (int): upper bound (will be converted to nearest valid odd number)

    Returns:
        int: Randomly sampled odd number from the range

    Note:
        - Input values will be converted to nearest valid odd numbers:
          * Values less than 3 will become 3
          * Even values will be rounded up to next odd number
        - After normalization, high must be >= low

    rF   rH   r   r(   )rL   Úrandint)r‹   ÚlowÚhighÚnum_odd_valuesÚrand_idxs        r    Úsample_odd_from_ranger�   I  sŠ   € ô& ˆa�˜˜a™ 1™Ñ%Ó
&€Cäˆq�$˜$ ™( a™-Ñ(Ó)€Dô ˆt�S‹>€Dà
ˆd‚{Øˆ
ð ˜S‘j QÑ&¨Ñ*€Nà×#Ñ# A ~¸Ñ'9Ó:€HØ�!�h‘,ÑÐr!   c                óR  — |dk(  rt        | dz  «      dz  dz   n|}|dz  dk(  r|dz   n|}t        j                  |dz   |dz  |«      }t        j                  d|| z  dz  z  «      }||j	                  «       z  }|dd…t        j
                  f   |t        j
                  dd…f   z  S )ak  Create a Gaussian kernel following PIL's approach.

    Args:
        sigma (float): Standard deviation for Gaussian kernel.
        ksize (int): Kernel size. If 0, size is computed as int(sigma * 3.5) * 2 + 1
               to match PIL's implementation. Otherwise, must be positive and odd.

    Returns:
        np.ndarray: 2D normalized Gaussian kernel.

    r   ç      @rH   r(   ç      à¿N)rr   r+   r€   ÚexprO   Únewaxis©r5   r   Úsizer:   Ú	kernel_1ds        r    Úcreate_gaussian_kernelr¦   m  s®   € ð (-°¢zŒ3ˆu�s‰{Ó˜aÑ !Ò#°u€Dð ˜a‘x 1’}ˆ4�!Š8¨$€Dô 	�‰�d˜a‘i�L $¨!¡)¨TÓ2€Aô —‘�t˜q 5™y¨QÑ.Ñ.Ó/€IØ˜IŸM™M›OÑ+€Ið ’QœŸ
™
�]Ñ# i´·
±
ºA°Ñ&>Ñ>Ð>r!   c                óÐ   — |dk(  rt        | dz  «      dz  dz   n|}|dz  dk(  r|dz   n|}t        |¬«      }t        j                  d|| z  dz  z  «      }||j	                  «       z  S )an  Create a 1D Gaussian kernel following PIL's approach.

    Args:
        sigma (float): Standard deviation for Gaussian kernel.
        ksize (int): Kernel size. If 0, size is computed as int(sigma * 3.5) * 2 + 1
               to match PIL's implementation. Otherwise, must be positive and odd.

    Returns:
        np.ndarray: 1D normalized Gaussian kernel.

    r   rŸ   rH   r(   ©r¤   r    )rr   Ú"create_gaussian_kernel_input_arrayr+   r¡   rO   r£   s        r    Úcreate_gaussian_kernel_1drª   Š  sv   € ð (-°¢zŒ3ˆu�s‰{Ó˜aÑ !Ò#°u€Dð ˜a‘x 1’}ˆ4�!Š8¨$€Dô 	+°Ô5€Aô —‘�t˜q 5™y¨QÑ.Ñ.Ó/€IØ�y—}‘}“Ñ&Ð&r!   c           	     ó®   — | dk  r3t        j                  t        t        | dz   | dz  dz   d«      «      «      S t        j                  | dz   | dz  | «      S )aí  Creates a 1-D array which will create an array of x-coordinates which will be input for the
    gaussian function (values from -size/2 to size/2 with step size of 1)

    Piecewise function is needed as equivalent python list comprehension is faster than np.linspace
    for values of size < 100

    Args:
        size (int): kernel size

    Returns:
        np.ndarray: x-coordinate array which will be input for gaussian function that will be used for
        separable gaussian blur

    éd   rH   r(   )r+   r,   Úlistr1   r€   r¨   s    r    r©   r©   ¤  sS   € ð ˆc‚zÜ�x‰xœœU T¨Q¡Y <°$¸!±)¸q±À!ÓDÓEÓFÐFä�;‰;˜ ™�| T¨Q¡Y°Ó5Ð5r!   )r   ú
np.ndarrayr   rr   Úreturnr®   )r   r®   r5   r   r6   rr   r7   rr   r8   r®   r9   zLiteral['fast', 'exact']r¯   r®   )r   r®   rP   rr   rQ   r   r¯   r®   )r   r®   rW   rr   r¯   r®   )r   r®   rb   znp.ndarray | Sequence[int]r¯   r®   )ri   útuple[int, int]rj   rr   rk   ú
str | Noner¯   r°   )N)ri   r°   rk   r±   r¯   r°   )r   )rs   zint | tuple[int, int]rt   r   rj   rr   r¯   r°   )r‡   rr   rˆ   r   r‰   r   rŠ   Úboolr‹   úrandom.Randomr¯   r®   )r‹   r³   r™   rr   rš   rr   r¯   rr   )r5   r   r   rr   r¯   r®   )r¤   rr   r¯   r®   ).Ú__doc__Ú
__future__r   ÚrandomÚcollections.abcr   Ú	itertoolsr   Úmathr   Útypingr   Úwarningsr   r   Únumpyr+   Úalbucorer	   r
   r   r   r   Úpydanticr   Ú1albumentations.augmentations.geometric.functionalr   Ú-albumentations.augmentations.pixel.functionalr   Ú$albumentations.core.type_definitionsr   Ú__all__r   r   r   r   r   r   rm   ro   rv   r–   r�   r¦   rª   r©   © r!   r    ú<module>rÄ      sU  ðñõ #ã Ý $Ý Ý Ý Ý ã 
Û ß aÕ aÝ #å CÝ BÝ 6â
[€ð òó ðð" Ø	òó 
ó ðð" ð4;Ø	ð4;àð4;ð ð4;ð ð	4;ð
 
ð4;ð #ð4;ð ò4;ó ð4;ón(ó4Rð, Øò1ó 	ó ð1ó*ôôð2PØðPàðPð ðPð ð	Pð
  ðPð óPóf! ôH?ô:'ô46r!   