
    biwt                       d dl mZ d dlmZ d dlmZmZmZ d dlZd dl	Z
d dlZd dlZd dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZ e
j:                  e
j<                  e
j>                  dZ ej:                  ej<                  ejB                  dZ"dEdZ#dFd	Z$dGd
Z%dGdZ&	 	 	 	 	 	 	 	 dHdZ'edIdJd       Z(	 	 	 	 	 	 	 	 	 	 dKdZ)	 	 	 	 	 	 	 	 dLdZ*	 	 	 	 	 	 	 	 dMdZ+	 	 	 	 	 	 	 	 dNdZ,	 	 	 	 	 	 	 	 dOdZ-dPdZ.edQd       Z/dRdZ0edSd       Z1edTd       Z2edFd       Z3dUdVdZedUdPd       Z4dRdZ5dPdZ6edUdSd       Z7edWd       Z8edUdWd       Z9dUdVd ZdXd!Z:edXd"       Z;edXd#       Z<dYd$Z=dZd%Z>edGd&       Z?dUd[d'Z@edUd\d(       ZdEd)ZAedEd*       ZBe	 dU	 	 	 	 	 	 	 	 	 	 	 d]d+       ZCedEd,       ZDd^d-ZEed^d.       ZFd_d/ZGedUd_d0       ZHed`d1       ZIed`d2       ZJed`d3       ZKd`d4ZLdadbd5ZMedadbd6       ZNedadbd7       ZOdadbd8ZPdadcd9ZQedadcd:       ZRdadcd;ZSeddd<       ZTeddd=       ZUddd>ZVeddd?       ZWeddd@       ZXdddAZYdedBZZdfdCZ[dfdDZ\y)g    )annotationswraps)AnyCallableLiteralN)
contiguouspreserve_channel_dim)
MAX_OPENCV_WORKING_CHANNELSMAX_VALUES_BY_DTYPEMONO_CHANNEL_DIMENSIONSNormalizationType	ValueTypeclipclippedconvert_valueget_max_valueget_num_channels)multiplyaddpowerc           	     f   | j                   }| j                  }|j                  |k7  rt        |j                  |d      |d      }t	        j
                  t        j                  | j                  d      |j                  |d      j                  d      ||      |      j                  |      S )NFcopyTinplace)alphabetadtype)	shaper!   r   astypenp
frombuffersswsumreshape)img1weight1img2weight2original_shapeoriginal_dtypes         M/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/albucore/functions.pyadd_weighted_simsimdr0      s    ZZNZZNzz^#DKKUK;^UYZ==
R $++n5+"I"Q"QRT"U]dkrs g    c                    t        | d|d      S N   )r0   imgvalues     r/   add_array_simsimdr8   -   s    Qq11r1   c                D    t        | |t        j                  |       d      S Nr   )r0   r$   
zeros_liker5   s     r/   multiply_by_constant_simsimdr<   1   s    UBMM#,>BBr1   c                    t        | dt        j                  |       |z  j                  | j                  d      d      S )Nr4   Fr   )r0   r$   	ones_liker#   r!   r5   s     r/   add_constant_simsimdr?   5   s7    Qc):U)B(J(J399[`(J(acdeer1   c                t   t         |    }| t        j                  k(  r|dk(  rt        j                  |      }t        j                  |t        j
                        j                  dd      }t        j                  d|dz   t        j
                        }|t        v rt        |   ||      S t        d|       )Nr   r    r   r4   r   zUnsupported operation: )
r   r$   uint8truncarrayfloat32r(   arangenp_operations
ValueError)r!   r7   	operation	max_valueluts        r/   create_lut_arrayrK   9   s    
 $E*IY%/HHU"**-55b!<E
))Ay1}BJJ
7CM!Y'U33
.yk:
;;r1   c                ~    |s| j                         } t        j                  t        |       t        |      d       | S NTr   )r   sz	translate
memoryview)r6   rJ   r   s      r/   sz_lutrQ   L   s-    hhjLLC*S/4@Jr1   c                t   | j                   }t        |t        t        f      r&t	        |||      }t        | t        ||d      d      S | j                  d   }t        t	        |||      |d      }t        j                  t        |      D cg c]  }t        | d d d d |f   ||   |       c}      S c c}w )NFr   r   )r!   
isinstanceintfloatrK   rQ   r   r"   cv2mergerange)	r6   r7   rH   r   r!   rJ   num_channelslutsis	            r/   	apply_lutr\   U   s     IIE%#u&ueY7c4UE:EBB99R=L y95%PD99eLFYZfSAq\47G<Z[[Zs   !B5c                b    t        |t        t        f      rt        | ||      S t	        | ||      S N)rS   rT   rU   _prepare_scalar_value_prepare_array_valuer6   r7   rH   s      r/   prepare_value_opencvrb   g   s8     ec5\* 	c5)4 "#ui8r1   c                   |dk(  r(| j                   t        j                  k(  rt        |      }t	        |       }|t
        kD  r}|dk(  rC|dk  rt        j                  n| j                   }t        j                  | j                  ||      S |dk(  r0t        j                  | j                  |t        j                        S |S )Nr   r   r    r   )	r!   r$   rA   rT   r   r   rD   fullr"   )r6   r7   rH   rY   	cast_types        r/   r_   r_   s   s    
 Ecii2883E
#C(L11&+ai

SYYI77399e9==
"77399e2::>>Lr1   c                   |j                   t        j                  k(  r!|j                  t        j                  d      }|j
                  dk(  r|j                  ddd      }t        j                  || j                        }|dk(  r| j                   t        j                  k(  rht        j                  |dk\        rt        |t        j                  d      S t        j                  |      j                  t        j                  d      S |S )NFr   r4   r   r   r   r   )r!   r$   float64r#   rD   ndimr(   broadcast_tor"   rA   allr   rB   ra   s      r/   r`   r`      s    
 {{bjj RZZe4zzQaB'OOE399-EEcii288366%1*rxx77xx%%bjju%==Lr1   c                    |dk(  r2| j                   t        j                  k(  rt        j                  |      }t	        |   | j                  t        j                  d      |      S )Nr   Fr   )r!   r$   rA   int16rF   r#   rD   ra   s      r/   apply_numpyrm      sK    
 Ecii2883#CJJrzzJ$FNNr1   c                    t        | |d|      S Nr   r\   r6   r7   r   s      r/   multiply_lutrr      s    S%W55r1   c                    t        | |d      }| j                  t        j                  k(  r5t	        j
                  | j                  t        j                  d      |      S t	        j
                  | |      S )Nr   Fr   )rb   r!   r$   rA   rV   r   r#   rD   r5   s     r/   multiply_opencvrt      sS     eZ8E
yyBHH||CJJrzzJ>FF<<U##r1   c                    t        | |d      S ro   rm   r5   s     r/   multiply_numpyrw      s    sE:..r1   c                    | j                   t        j                  k(  rt        | ||      S | j                   t        j                  k(  rt        | |      S t        | |      S r^   )r!   r$   rA   rr   rD   rw   rt   rq   s      r/   multiply_by_constantry      sK    
yyBHHC00
yyBJJc5))3&&r1   c                    | j                   t        j                  k(  rt        | ||      S |t        kD  rt        | |      S t        | |      S r^   )r!   r$   rA   rr   r   rw   rt   )r6   r7   rY   r   s       r/   multiply_by_vectorr{      sF     yyBHHC0011c5))3&&r1   c                    t        | |      S r^   )rt   r5   s     r/   multiply_by_arrayr}      s    3&&r1   c                    t        |       }t        ||      }t        |t        t        f      rt        | ||      S t        |t        j                        r|j                  dk(  rt        | |||      S t        | |      S r3   )r   r   rS   rU   rT   ry   r$   ndarrayrh   r{   r}   r6   r7   r   rY   s       r/   r   r      sk    #C(L%.E%%&#C88%$q!#ulGDDS%((r1   c                *   t        | |d      }| j                  t        j                  k(  xrX t	        |t
        t        f      xr |dk  xs9 t	        |t        j                        xr |j                  t        j                  k7  }|rpt        j                  | j                  t        j                  d      t	        |t
        t        f      r|      S |j                  t        j                  d            S |r| nd }t        j                  | ||      S )Nr   r   Fr   )dst)rb   r!   r$   rA   rS   rT   rU   r   rV   r   r#   rD   )r6   r7   r   needs_floatr   s        r/   
add_opencvr      s     eU3E
 ))rxx' 	EC<	(	6UQYvJubjj<Y<u^c^i^imomumu^u  wwJJrzzJ.U|4E
 	
:?,,rzzX],:^
 	
 #dC7733''r1   c                    t        | |d      S Nr   rv   r5   s     r/   	add_numpyr      s    sE5))r1   c                    t        | |d|      S r   rp   rq   s      r/   add_lutr      s    S%00r1   c                    t        | ||      S r^   r   rq   s      r/   add_constantr          c5'**r1   c                p    | j                   t        j                  k(  rt        | ||      S t	        | ||      S r^   )r!   r$   rA   r   r   rq   s      r/   
add_vectorr      s0    
yyBHHsE7++c5'**r1   c                    t        | ||      S r^   r   rq   s      r/   	add_arrayr     r   r1   c                &   t        |       }t        ||      }t        |t        t        f      r<|dk(  r| S | j
                  t        j                  k(  rt	        |      }t        | ||      S |j                  dk(  rt        | ||      S t        | ||      S )Nr   r4   )r   r   rS   rU   rT   r!   r$   rA   r   rh   r   r   r   s       r/   r   r     s    #C(L%.E%%&A:J99 JEC00.3jjAo:c5'*a9SRWY`Caar1   c                X    | j                  t        j                  d      } | |z  } | |z  S NFr   r#   r$   rD   )r6   meandenominators      r/   normalize_numpyr     s,    
**RZZe*
,C4KCr1   c                   | j                  t        j                  d      } t        j                  | t        j                        }t        j                  | t        j                        }t	        |t
        t        f      r0t        j                  | j                  |t        j                        }t	        |t
        t        f      r0t        j                  | j                  |t        j                        }||z   j                  t        j                  d      }||z   }t        j                  | |      }t        j                  ||t        j                        S )NFr   r    )r#   r$   rD   r;   rS   rU   rT   rd   r"   rV   subtractr   CV_32F)r6   r   r   mean_imgdenominator_imgresults         r/   normalize_opencvr     s    
**RZZe*
,C}}S

3HmmCrzz:O $%wwsyy$bjj9+s|,ggciiBJJG 4''

'?H%3O\\#x(F<<szzBBr1   c                   | j                   }t        |   }t        |       }t        |t        t
        f      r[t        |t        t
        f      rEt        j                  d|dz   t        j                        |z
  |z  }t        j                  | |      S t        |t        j                        r!|j                  dk7  r|j                  dd      }t        |t        j                        r|j                  dd      }t        j                  d|dz   t        j                        |z
  |z  }t        j                  t        |      D cg c]%  }t        j                  | d d d d |f   ||         ' c}      S c c}w )Nr   r4   r     r   )r!   r   r   rS   rU   rT   r$   rE   rD   rV   LUTr   r"   r(   rW   rX   )	r6   r   r   r!   rI   rY   rJ   rZ   r[   s	            r/   normalize_lutr   0  s   IIE#E*I#C(L+s|,D5#,1OyyIM<tC{RwwsC  +rzz*{/@/@B/F!))"a0$

#||B"IIaQbjj9D@KOD99eL>QRcggc!Q'lDG4RSSRs   *E5c                    t        |       }t        ||      }t        ||      }| j                  t        j                  k(  rt        | ||      S t        | ||      S r^   )r   r   r!   r$   rA   r   r   )r6   r   r   rY   s       r/   	normalizer   E  sR    #C(L\:K|,D
yyBHHS$44C{33r1   c                    t        | |d      S Nr   rv   )r6   exponents     r/   power_numpyr   O  s    sHg..r1   c                   | j                   t        j                  k(  rt        j                  | |      S | j                   t        j
                  k(  r$t        |      |k(  rt        j                  | |      S | j                   t        j
                  k(  rGt        |t              r7| j                  t        j                  d      }t        j                  ||      S t        d| j                    d|       )z(Handle the 'power' operation for OpenCV.Fr   zUnsupported image type z  for power operation with value )r!   r$   rD   rV   powrA   rT   rS   rU   r#   rG   )r6   r7   	img_floats      r/   power_opencvr   S  s     yyBJJwwsE""
yyBHHUu!4wwsE""
yyBHHE5!9JJrzzJ6	wwy%((
.syyk9YZ_Y`a
bbr1   c                    t        | |d|      S r   rp   )r6   r   r   s      r/   	power_lutr   e  s    S(GW55r1   c                    t        |       }t        ||      }| j                  t        j                  k(  rt        | ||      S t        |t        t        f      rt        | |      S t        | |      S r^   )r   r   r!   r$   rA   r   rS   rU   rT   r   r   )r6   r   r   rY   s       r/   r   r   i  s_    #C(LX|4H
yyBHHh00(UCL)C**sH%%r1   c                    | j                  t        j                  d      |z  |j                  t        j                  d      |z  z   S r   r   r)   r*   r+   r,   s       r/   add_weighted_numpyr   v  s;    ;;rzz;.84;;rzzX];;^ah;hhhr1   c                4    t        j                  | |||d      S r:   )rV   addWeightedr   s       r/   add_weighted_opencvr   z  s    ??4$;;r1   c                   | j                   }t        |   }|dk(  r|dk(  r| S |dk(  r|dk(  r|S |dk(  r|dk(  rt        j                  |       S |dk(  r|dk(  rt	        | ||      S t        j
                  d|dz   t        j                        |z  }t        j                  | |      }t        j
                  d|dz   t        j                        |z  }	t        j                  ||	      }
t        ||
|      S )Nr4   r   r    )
r!   r   r$   r;   r   rE   rD   rV   r   r   )r)   r*   r+   r,   r   r!   rI   lut1result1lut2result2s              r/   add_weighted_lutr     s     JJE#E*I!|1!|1!|1}}T""!|1tW--99Q	ARZZ87BDggdD!G99Q	ARZZ87BDggdD!Ggw00r1   c                    | j                   |j                   k7  r&t        d| j                    d|j                    d      t        | |||      S )Nz/The input images must have the same shape. Got z and .)r"   rG   r0   r   s       r/   add_weightedr     sL    zzTZZJ4::,V[\`\f\f[gghijjgtW==r1   c                J   t        |t        t        f      rA|dk(  r<t        |t        t        f      r&|dk(  r!t        j                  | | j
                        S |dk7  rt        j                  | |      nt        j                  |       }|dk(  r|S t        j                  ||      S )Nr   r    )rS   rT   rU   r$   r;   r!   r   r   r6   factorr7   r   s       r/   multiply_add_numpyr     s    %#u&5A:*VcSX\:Z_eij_j}}S		22)/1R[[f%"--:LFaZ6:RVVFE%::r1   c                $   t        |t        t        f      r5|dk(  r0t        |t        t        f      r|dk(  rt        j                  |       S | j                  t        j                  d      }|dk7  r<t        j                  |t        j                  |      |z  t        j                        n t        j                  || j                        }|dk(  r|S t        j                  |t        j                  |      |z  t        j                        S )Nr   Fr   r    )rS   rT   rU   r$   r;   r#   rD   rV   r   r>   CV_64Fr!   r   r   s       r/   multiply_add_opencvr     s    %#u&5A:*VcSX\:Z_eij_j}}S!!ZZ

Z/F Q; 	VR\\&1F:#**M]]63 
 aZ6dSWWVR\\&5IE5QY\YcYc%ddr1   c                   | j                   }t        |   }t        |       }t        |t        t
        f      r^t        |t        t
        f      rHt        t        j                  d|dz   t        j                        |z  |z   |d      }t        | ||      S t        |t        j                        r!|j                  dk7  r|j                  dd      }t        |t        j                        r!|j                  dk7  r|j                  dd      }t        t        j                  d|dz   t        j                        |z  |z   |d      }t        j                  t!        |      D 	cg c]  }	t        | d d d d |	f   ||	   |       c}	      S c c}	w )	Nr   r4   r    Fr   r   r   T)r!   r   r   rS   rU   rT   r   r$   rE   rD   rQ   r   r"   r(   rV   rW   rX   )
r6   r   r7   r   r!   rI   rY   rJ   rZ   r[   s
             r/   multiply_add_lutr     s2   IIE#E*I#C(L&5#,'Juucl,K299Q	ARZZ@6IEQSXbghc3((&"**%&,,"*<A&%$):b!$		!Y]"**=FNPU_cdD99eLFYZfSAq\47G<Z[[Zs   "!F
c                    t        |       }t        ||      }t        ||      }| j                  t        j                  k(  rt        | |||      S t        | ||      S r^   )r   r   r!   r$   rA   r   r   )r6   r   r7   r   rY   s        r/   multiply_addr     sT    #C(L6<0F%.E
yyBHHVUG<<sFE22r1   c                j   | j                  t        j                  d      } d}| j                  t        k(  rt        j
                  | d      } |dk(  s| j                  d   dk(  r|dk(  r| j                         j                         }| j                         j                         |z   }| j                  d   t        kD  r,t        j                  | |      }t        j                  | |      }t        j                  t        j                  | |      |      }t        j                  |d	d
|      S |dk(  rt        j                   |       \  }}|d d df   }|d d df   }| j                  d   t        kD  r,t        j                  | |      }t        j                  | |      }t        j                  t        j                  | |      |t        j"                        }t        j                  |d	d
|      S |dk(  s| j                  d   dk(  r\|dk(  rW| j%                         }| j'                         }t        j(                  | d ddt        j*                  t        j"                        S |dk(  r| j%                  d      }| j'                  d      }| j                  d   t        kD  r,t        j                  | |      }t        j                  | |      }t        j                  t        j                  t        j                  | |      ||z
  |z   t        j"                        d	d
|       S t-        d|       )NFr   -C6?r   axisimager4   image_per_channel   outr   r    min_maxmin_max_per_channel)r   r   	norm_typer!   r   r4   Unknown normalization method: )r#   r$   rD   rh   r   expand_dimsr"   r   itemstdr   	full_likerV   divider   r   
meanStdDevr   minmaxr   NORM_MINMAXrG   )r6   normalizationepsr   r   normalized_imgimg_minimg_maxs           r/   normalize_per_image_opencvr     s   
**RZZe*
,C
C
xx**nnSr*CIIbMQ$6=L_;_xxz gginn$99R=66<<T*D,,sC(CCLLd$;SAww~sBNCC++NN3'	cAqDz!Q$i99R=66<<T*D,,sC(CCLLd$;S

Sww~sBNCC	!ciimq&8]Nc=c'')'')}}S$aa3??Z]ZdZdee--''v'&''v'&99R=66ll30Gll30GwwJJs||C1Gg4E4KTWT^T^_	
 	
 5m_E
FFr1   c                   | j                  t        j                  d      } d}| j                  t        k(  rt        j
                  | d      } |dk(  rD| j                         }| j                         |z   }| |z
  |z  }t        j                  |dd|	      S |d
k(  rH| j                  d      }| j                  d      |z   }| |z
  |z  }t        j                  |dd|	      S |dk(  rE| j                         }| j                         }	t        j                  | |z
  |	|z
  |z   z  dd| 	      S |dk(  rI| j                  d      }| j                  d      }	t        j                  | |z
  |	|z
  |z   z  dd| 	      S t        d|       )NFr   r   r   r   r   r   r   r   r   r   r   r   r   )r#   r$   rD   rh   r   r   r   r   r   r   r   rG   )
r6   r   r   r   r   r   
pixel_mean	pixel_stdr   r   s
             r/   normalize_per_image_numpyr     s}   
**RZZe*
,C
C
xx**nnSr*xxzggi#o*+ww~sBNCC++XX6X*
GGG(3.	
*i7ww~sBNCC	!'')'')wwg'G*;c*ABCQTUU--''v'&''v'&wwg'G*;c*ABCQTUU
5m_E
FFr1   c                p   | j                   }t        |   }d}t        |       }| j                  t        k(  rt        j                  | d      } |dk(  s| j                  d   dk(  r}|dk(  rx| j                         }| j                         |z   }t        j                  d|dz   t
        j                        |z
  |z  }t        j                  | |      j                  d	d
      S |dk(  r| j                  d      }	| j                  d      |z   }
t        |      D cg c]7  }t        j                  d|dz   t
        j                        |	|   z
  |
|   z  9 }}t        j                   t        |      D cg c]5  }t        j                  | d d d d |f   ||         j                  d	d
      7 c}      S |dk(  s| j                  d   dk(  r|dk(  r{| j#                         }| j%                         }t        j                  d|dz   t
        j                        |z
  ||z
  |z   z  }t        j                  | |      j                  d	d
      S |dk(  r| j#                  d      }| j%                  d      }t        |      D cg c]@  }t        j                  d|dz   t
        j                        ||   z
  ||   ||   z
  |z   z  B }}t        j                   t        |      D cg c]%  }t        j                  | d d d d |f   ||         ' c}      S t'        d|       c c}w c c}w c c}w c c}w )Nr   r   r   r   r4   r   r   r    r   r   r   r   r   r   )r!   r   r   rh   r   r$   r   r"   r   r   rE   rD   rV   r   r   rX   rW   r   r   rG   )r6   r   r!   rI   r   rY   r   r   rJ   r   r   crZ   r[   r   r   s                   r/   normalize_per_image_lutr   3  s   IIE#E*I
C#C(L
xx**nnSr*CIIbMQ$6=L_;_xxzggi#oyyIM<tCsJwwsC %%c2..++XX6X*
GGG(3.	dijvdw
_`RYYq)a-rzz:Z]JiXYlZ
 
 yyPUVbPcd1#''#aAg,Q8==c2Fdee	!ciimq&8]Nc=c'')'')yyIM<wF7U\K\_bKbcwwsC %%c2..--''v'&''v'& <(
 YYq)a-rzz:WQZGGTUJY`abYcLcfiLij
 

 yy%BUVQ#''#aAg,Q8VWW
5m_E
FF+
 e

 Ws   <L$4:L)AL.%*L3c                v    | j                   t        j                  k(  r|dk7  rt        | |      S t	        | |      S )Nper_image_per_channel)r!   r$   rA   r   r   )r6   r   s     r/   normalize_per_imager   ^  s4    
yyBHH2I!I&sM::%c=99r1   c                x    |t        | j                        }| |z  j                  t        j                  d      S r   )r   r!   r#   r$   rD   r6   rI   s     r/   to_float_numpyr   e  s4    !#)),	)O##BJJU#;;r1   c                   |t        | j                        }| j                  t        j                  d      }t        |       }|t        kD  r,t        j                  ||      }t        j                  ||      S t        j                  ||      S r   )
r   r!   r#   r$   rD   r   r   r   rV   r   )r6   rI   r   rY   max_value_arrays        r/   to_float_opencvr   k  ss    !#)),	

2::E
2I#C(L11,,y)<zz)_55 ::i++r1   c                    | j                   t        j                  k7  rt        d      |t        | j                      }t        j
                  dt        j                        |z  }t        j                  | |      S )Nz.LUT method is only applicable for uint8 images   r    )	r!   r$   rA   rG   r   rE   rD   rV   r   )r6   rI   rJ   s      r/   to_float_lutr   }  s\    
yyBHHIJJ'		2	
))Crzz
*Y
6C773r1   c                &   | j                   t        j                  k(  r!| j                  t        j                  d      S | j                   t        j                  k(  r| S | j                   t        j
                  k(  rt        | |      S t        | |      S r   )r!   r$   rg   r#   rD   rA   r   r   r   s     r/   to_floatr     sh    
yyBJJzz"**5z11
yyBJJ

yyBHHC++#y))r1   c                d    |t        |      }t        t        j                  | |z        |d      S rM   )r   r   r$   rintr6   target_dtyperI   s      r/   from_float_numpyr    s.    !,/	i(,EEr1   c                d   |t        |      }| j                  t        j                  d      }t	        |       }|t
        kD  rKt        j                  ||      }t        t        j                  t        j                  ||            |d      S t        t        j                  | |z        |d      S )NFr   r   )r   r#   r$   rD   r   r   r   r   r   rV   r   )r6   r  rI   r   rY   r   s         r/   from_float_opencvr    s    !,/	

2::E
2I#C(L11,,y)<BGGCLLODE|]bcc i(,FFr1   c                   |t         j                  k(  r| S |t         j                  k(  r!| j                  t         j                  d      S | j                  t         j                  k(  rt        | ||      S t        | ||      S )a  Convert a floating-point image to the specified target data type.

    This function converts an input floating-point image to the specified target data type,
    scaling the values appropriately based on the max_value parameter or the maximum value
    of the target data type.

    Args:
        img (np.ndarray): Input floating-point image array.
        target_dtype (np.dtype): Target numpy data type for the output image.
        max_value (float | None, optional): Maximum value to use for scaling. If None,
            the maximum value of the target data type will be used. Defaults to None.

    Returns:
        np.ndarray: Image converted to the target data type.

    Notes:
        - If the input image is of type float32, the function uses OpenCV for faster processing.
        - For other input types, it falls back to a numpy-based implementation.
        - The function clips values to ensure they fit within the range of the target data type.
    Fr   )r$   rD   rg   r#   r!   r  r  r   s      r/   
from_floatr    sf    * rzz!
rzz!zz"**5z11
yyBJJ lI>>Cy99r1   c                    | d d d d ddf   S Nr   .r   r6   s    r/   hflip_numpyr
    s    q$B$|r1   c                    | j                   dkD  r| j                  d   dkD  rt        | d      S t        j                  | d      S )N      r4   	flip_coderh   r"   _flip_multichannelrV   flipr	  s    r/   	hflip_cv2r    <     xx!|		!s*!#3388Cr1   c                    t        |       S r^   )r  r	  s    r/   hflipr        S>r1   c                    | j                   dkD  r| j                  d   dkD  rt        | d      S t        j                  | d      S )Nr  r  r   r  r  r	  s    r/   	vflip_cv2r    r  r1   c                    | d d ddf   S r  r   r	  s    r/   vflip_numpyr    s    ttSy>r1   c                    t        |       S r^   )r  r	  s    r/   vflipr    r  r1   c                   | j                   dd \  }}| j                  dk(  rdn| j                   d   }| j                  dk(  s|dk  rt        j                  | |      S d}g }t	        d||      D ]{  }t        ||z   |      }| dddd||f   }	t        j                  |	|      }
|
j                  dk(  r&| j                  dk(  rt        j                  |
d      }
|j                  |
       } t        j                  |d      S )a%  Process images with more than 512 channels by splitting into chunks.

    OpenCV's flip function has a limitation where it can only handle images with up to 512 channels.
    This function works around that limitation by splitting the image into chunks of 512 channels,
    flipping each chunk separately, and then concatenating the results.

    Args:
        img: Input image with many channels
        flip_code: OpenCV flip code (0 for vertical, 1 for horizontal, -1 for both)

    Returns:
        Flipped image with all channels preserved
    Nr  r4   r  r      r   )
r"   rh   rV   r  rX   r   r$   r   appendconcatenate)r6   r  heightwidthrY   
chunk_sizeresult_chunksr[   end_idxchunkflipped_chunks              r/   r  r    s     IIbqMMFEA1399Q<L xx1}+xxY'' JM1lJ/ 
,a*nl3Aq!G)O$	2 "sxx1}NN=qAM]+
, >>-a00r1   c                0     t               d fd       }|S )ar  Decorator to ensure float32 input/output for image processing functions.

    This decorator converts the input image to float32 before passing it to the wrapped function,
    and then converts the result back to the original dtype if it wasn't float32.

    Args:
        func (Callable[..., np.ndarray]): The image processing function to be wrapped.

    Returns:
        Callable[..., np.ndarray]: A wrapped function that handles float32 conversion.

    Example:
        @float32_io
        def some_image_function(img: np.ndarray) -> np.ndarray:
            # Function implementation
            return processed_img
    c                    | j                   }|t        j                  k7  rt        |       }  | g|i |}|t        j                  k7  rt	        ||      S |S N)r  )r!   r$   rD   r   r  r6   argskwargsinput_dtyper   funcs        r/   float32_wrapperz#float32_io.<locals>.float32_wrapper*  sS    ii"**$3-Cc+D+F+?Jbjj?Xz&{;d^ddr1   r6   
np.ndarrayr-  r   r.  r   returnr3  r   )r0  r1  s   ` r/   
float32_ior5    s%    & 4[e e r1   c                0     t               d fd       }|S )ah  Decorator to ensure uint8 input/output for image processing functions.

    This decorator converts the input image to uint8 before passing it to the wrapped function,
    and then converts the result back to the original dtype if it wasn't uint8.

    Args:
        func (Callable[..., np.ndarray]): The image processing function to be wrapped.

    Returns:
        Callable[..., np.ndarray]: A wrapped function that handles uint8 conversion.

    Example:
        @uint8_io
        def some_image_function(img: np.ndarray) -> np.ndarray:
            # Function implementation
            return processed_img
    c                    | j                   }|t        j                  k7  rt        | t        j                        }  | g|i |}|t        j                  k7  rt	        |      S |S r+  )r!   r$   rA   r  r   r,  s        r/   uint8_wrapperzuint8_io.<locals>.uint8_wrapperI  sW    ii"(("Srxx8Cc+D+F+#."((#:xFFr1   r2  r   )r0  r8  s   ` r/   uint8_ior9  6  s%    & 4[G G r1   )
r)   r3  r*   rU   r+   r3  r,   rU   r4  r3  )r6   r3  r7   r3  r4  r3  )r6   r3  r7   rU   r4  r3  )r!   ztype[np.number]r7   float | np.ndarrayrH   #Literal['add', 'multiply', 'power']r4  r3  )T)r6   r3  rJ   r3  r   boolr4  r3  )
r6   r3  r7   r:  rH   r;  r   r<  r4  r3  )r6   r3  r7   np.ndarray | floatrH   Literal['add', 'multiply']r4  r3  )r6   r3  r7   rU   rH   r>  r4  r=  )r6   r3  r7   r3  rH   r>  r4  r3  )r6   r3  r7   r:  rH   r;  r4  r3  )r6   r3  r7   r=  r   r<  r4  r3  )r6   r3  r7   r=  r4  r3  )r6   r3  r7   r:  r4  r3  )r6   r3  r7   rU   r   r<  r4  r3  )
r6   r3  r7   r3  rY   rT   r   r<  r4  r3  )F)r6   r3  r7   r   r   r<  r4  r3  )r6   r3  r7   r3  r   r<  r4  r3  )r6   r3  r   r:  r   r:  r4  r3  )r6   r3  r   r   r   r   r4  r3  )r6   r3  r   r:  r4  r3  )r6   r3  r   r:  r   r<  r4  r3  )r6   r3  r   r   r   r<  r4  r3  )r)   r3  r*   rU   r+   r3  r,   rU   r   r<  r4  r3  )r6   r3  r   r   r7   r   r4  r3  )
r6   r3  r   r   r7   r   r   r<  r4  r3  )r6   r3  r   r   r4  r3  r^   )r6   r3  rI   float | Noner4  r3  )r6   r3  r  znp.dtyperI   r?  r4  r3  )r6   r3  r4  r3  )r6   r3  r  rT   r4  r3  )r0  Callable[..., np.ndarray]r4  r@  )]
__future__r   	functoolsr   typingr   r   r   rV   numpyr$   simsimdr&   stringzillarN   albucore.decoratorsr	   r
   albucore.utilsr   r   r   r   r   r   r   r   r   r   r   r   r   rF   r   cv2_operationsr0   r8   r<   r?   rK   rQ   r\   rb   r_   r`   rm   rr   rt   rw   ry   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r  r  r5  r9  r   r1   r/   <module>rJ     s{   "  ) ) 
    @    [["((K!ll377SWWM2Cf<<< 3< 	<&  \	\\ 3\ 	\
 \$				 *	 			 * 	$	 * 	"O	OO 3O 	O6 $ $/ 	' 	' 	' 	' 	' 	'
) ( (**1 	+ 	+ 	+ 	+ 	+ 	+b  C C& T T(4/ c c"6 		& 		&i < <  1
11 1 	1
 1 1 1> 	> 	>; 
e 
e\( 	3 	3 0G 0Gf G G@ 'G 'GT:< , ,"  *F G G":B        '1T>r1   