
    biy                       d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	 ej                  dk\  r	d dlmZmZ nd dlmZmZ d dlZd dlZdZdZdZd	ZdZd	Zed
   Z ed      Z ej2                  d      d ej2                  d      d ej2                  d      d ej2                  d      d ej2                  d      d ej2                  d      dej4                  dej6                  dej8                  dej:                  dej<                  dej>                  dej@                  diZ!ej4                  ejD                  ej6                  ejF                  ej<                  ejH                  ej>                  ejJ                  ej@                  ejL                   ej2                  d      ejD                   ej2                  d      ejF                   ej2                  d      ejH                   ej2                  d      ejJ                   ej2                  d      ejL                  i
Z'	 	 	 	 	 	 	 	 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/d)d Z0e	ejb                  e2e3f   Z4d*d!Z5y)+    )annotationsNwraps)AnyCallableLiteralUnion)   
   )Concatenate	ParamSpecr
         )imageimage_per_channelmin_maxmin_max_per_channelPuint8   uint16i  uint32l    float16g      ?float32float64iint32c                8     t               d fd       }|S )a  Wrap OpenCV function to enable processing images with more than 4 channels.

    Limitations:
        This wrapper requires image to be the first argument and rest must be sent via named arguments.

    Args:
        process_fn: Transform function (e.g cv2.resize).
        args: Additional positional arguments.
        kwargs: Additional keyword arguments.

    Returns:
        np.ndarray: Transformed image.
    c                   g 
|}|z  }t        |       }|t        kD  rg }t        d|d      D ]  }||z
  t        k(  r[t        d      D ]L  }| d d d d ||z   ||z   dz   f   }	 |	g|i |}	t	        j
                  |	d      }	|j                  |	       N j| d d d d ||dz   f   }	 |	g|i |}	|j                  |	        t	        j                  |      S  | g|i |S )Nr   r   r      )get_num_channelsMAX_OPENCV_WORKING_CHANNELSrangeTWOnpexpand_dimsappenddstack)imgprocess_argsprocess_kwargsall_args
all_kwargsnum_channelschunksindexichunkargskwargs
process_fns             I/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/albucore/utils.py__process_fnz-maybe_process_in_chunks.<locals>.__process_fnL   s"    *T)L)%+n%<
',55Fq,2 )%'3."1X - #Aq%!)eai!m*C$C D *5 J8 Jz J "ub 9e,	-  1eeai&7 78E&uFxF:FEMM%() 99V$$#77J77    )r)   
np.ndarrayr*   P.argsr+   P.kwargsreturnr9   r   )r5   r3   r4   r7   s   ``` r6   maybe_process_in_chunksr=   9   s$    & :8 80 r8   c                    t         |   }|rt        j                  | d||       S t        j                  | d|      j                  |d      S )Nr   )outF)copy)MAX_VALUES_BY_DTYPEr%   clipastype)r)   dtypeinplace	max_values       r6   rB   rB   h   sG    #E*IwwsAyc227739%,,U,??r8   c                0     t               d fd       }|S )Nc                    | j                   } | g|i |}|j                   t        j                  k(  r|S t        ||      S N)rD   r%   r   rB   )r)   r3   r4   rD   resultfuncs        r6   wrapped_functionz!clipped.<locals>.wrapped_functionp   sB    		c+D+F+<<288#MFE""r8   )r)   r9   r3   r:   r4   r;   r<   r9   r   )rK   rL   s   ` r6   clippedrM   o   s!    
4[# # r8   c                J    | j                   t        k(  r| j                  d   S dS )Nr   r   )ndimNUM_MULTI_CHANNEL_DIMENSIONSshaper   s    r6   r!   r!   }   s!    "ZZ+GG5;;q>NQNr8   c                    t        |       dk(  S )Nr   r!   rR   s    r6   is_grayscale_imagerU      s    E"a''r8   c                `    t        | t        j                        r| j                  } t        |    S rI   )
isinstancer%   ndarrayrD   NPDTYPE_TO_OPENCV_DTYPE)values    r6   get_opencv_dtype_from_numpyr[      s$    %$"5))r8   c                &    t        |       t        k(  S rI   )r!   NUM_RGB_CHANNELSrR   s    r6   is_rgb_imager^      s    E"&666r8   c                     t        |       }|dvS )N>   r   r
   rT   )r   r.   s     r6   is_multispectral_imager`      s    #E*Lv%%r8   c                   t        | t        t        t        j                  t        j
                  f      r1t        | t        t        f      rt        |       S | j                         S t        | t        j                        rd| j                  dk(  r| j                         S | j                  dkD  r| S t        |       dk(  s|dk(  st        |       |k  rt        | d         S | d| S t        dt        |              )a  Convert a value to a float or numpy array based on its shape and number of channels.

    Args:
        value: Input value to convert (numpy array, float, or int)
        num_channels: Number of channels in the target image

    Returns:
        float: If value is a scalar or 1D array that should be converted to scalar
        np.ndarray: If value is a multi-dimensional array or channel vector

    Raises:
        TypeError: If value is of unsupported type
    r   r   NzUnsupported value type: )rW   floatintr%   r   r   itemrX   rO   len	TypeErrortype)rZ   r.   s     r6   convert_valuerh      s     %%bjj"**=>)%%>uU|PEJJLP %$::?::< ::>L u:?la/3u:3Lq?"]l##
.tE{m<
==r8   c                F    | t         vrd|  d}t        |      t         |    S )Nz(Can't infer the maximum value for dtype zS. You need to specify the maximum value manually by passing the max_value argument.)rA   RuntimeError)rD   msgs     r6   get_max_valuerl      s;    ''6ug >` ` 	 3u%%r8   )r5   0Callable[Concatenate[np.ndarray, P], np.ndarray]r3   r:   r4   r;   r<   z"Callable[[np.ndarray], np.ndarray])F)r)   r9   rD   r   rE   boolr<   r9   )rK   rm   r<   rm   )r   r9   r<   rc   )r   r9   r<   rn   )rZ   z$np.ndarray | int | np.dtype | objectr<   rc   )rZ   znp.ndarray | floatr.   rc   r<   zfloat | np.ndarray)rD   znp.dtyper<   rb   )6
__future__r   sys	functoolsr   typingr   r   r   r	   version_infor   r   typing_extensionscv2numpyr%   r]   MONO_CHANNEL_DIMENSIONSrP   FOURr$   r"   NormalizationTyper   rD   r   r   r   r   r   r   r   rA   CV_8UCV_16UCV_32FCV_64FCV_32SrY   r=   rB   rM   r!   rU   r[   r^   r`   rh   rX   rb   rc   	ValueTyperl    r8   r6   <module>r      s1   " 
  0 0w--8 
      Z[ cN BHHWsBHHXBHHX
BHHYBHHYBHHYHHcIIuIIzJJJJJJHHj " HHciiIIszzJJ

JJ

HHcjjBHHWsyyBHHX

BHHYBHHYBHHWszz ,@,, , (	,^@O(*7&
">J "**eS()	&r8   