
    #
3jK                     |   S SK JrJr  S SKr             SS jr\" SSSS9S 5       r\" S	SSS9S
 5       r\" SSSS9S 5       r\" SSSS9S 5       r	\" SSSS9S 5       r
\" S	SSS9S 5       r\" SSSS9S 5       r\" SSSSS9S 5       r\" SSSSS9S 5       r\" SSSSS9S 5       r\" SSSSS9S 5       rg)    )njitpndindexNFc                    U R                   [        R                  [        R                  4;   d   SU R                    35       eUR                   [        R                  [        R                  4;   d   SUR                    35       eUR                  U R                  SS :X  d!   SU R                   SUR                   35       e[        U R                  5      S:X  a  U R                  S   S:X  d   SU R                   35       eUc  SU	-  S	-   S-  S
[        R                  -  -  nUc  SU	-  S	-   S-  S
[        R                  -  -  nU R                  [        R                  5      n UR                  [        R                  5      nUR                  5       nUS:  a  US:  a  [        UUU UUS9  XS:H     R                  SS9nXS:H     R                  SS9n[        R                  " U 5      U-   n[        R                  " U 5      U-   n[        R                  " U5      nUu  nnnn[        UUUU UUUUUUUS9  [        R                  " U 5      n[        R                  " U 5      n[        R                  " U5      n[        UUUUUU UUS9  [        R                  " U 5      n[        R                  " U 5      n[        R                  " U5      n[        UUUUUUU UU	U
UUUUS9  U(       a  UUU4$ U$ )aA  
Estimate alpha from an input image and an input trimap using Shared Matting as proposed by :cite:`GastalOliveira2010SharedMatting`.

Parameters
----------
image: numpy.ndarray
    Image with shape :math:`h \times  w \times d` for which the alpha matte should be estimated
trimap: numpy.ndarray
    Trimap with shape :math:`h \times  w` of the image
return_foreground_background: numpy.ndarray
    Whether to return foreground and background estimate. They will be computed either way
trimap_expansion_radius: int
    How much to expand trimap.
trimap_expansion_threshold: float
    Which pixel colors are similar enough to expand trimap into
sample_gathering_angles: int
    In how many directions to search for new samples.
sample_gathering_weights: Tuple[float, float, float, float]
    Weights for various cost functions
sample_gathering_Np_radius: int
    Radius of Np function
sample_refinement_radius: int
    Search region for better neighboring samples
local_smoothing_radius1: int
    Radius for foreground/background smoothing
local_smoothing_radius2: int
    Radius for confidence computation
local_smoothing_radius3: int
    Radius for low frequency alpha computation
local_smoothing_sigma_sq1: float
    Squared sigma value for foreground/background smoothing
    Defaults to :code:`(2 * local_smoothing_radius1 + 1)**2 / (9 * pi)` if not given
local_smoothing_sigma_sq2: float
    Squared sigma value for confidence computation
local_smoothing_sigma_sq3: float
    Squared sigma value for low frequency alpha computation
    Defaults to :code:`(2 * local_smoothing_radius3 + 1)**2 / (9 * pi)` if not given

Returns
-------
alpha: numpy.ndarray
    Estimated alpha matte
foreground: numpy.ndarray
    Estimated foreground
background: numpy.ndarray
    Estimated background

Example
-------
>>> from pymatting import *
>>> image = load_image("data/lemur/lemur.png", "RGB")
>>> trimap = load_image("data/lemur/lemur_trimap.png", "GRAY")
>>> alpha, foreground, background = estimate_alpha_sm(
...     image,
...     trimap,
...     return_foreground_background=True,
...     sample_gathering_angles=4)
z1image.dtype should be float32 or float64, but is z2trimap.dtype should be float32 or float64, but is N   zPimage height and width should match trimap height and width, but image shape is z and trimap shape is    z"image should be RGB, but shape is    g      "@r           )k_ik_c      ?axis)
num_angleseNeAefeb	Np_radius)radius)radius1radius2radius3	sigma_sq1	sigma_sq2	sigma_sq3)dtypenpfloat32float64shapelenpiastypecopyexpand_trimapmean
zeros_likesample_gatheringsample_refinementlocal_smoothing)imagetrimapreturn_foreground_backgroundtrimap_expansion_radiustrimap_expansion_thresholdsample_gathering_anglessample_gathering_weightssample_gathering_Np_radiussample_refinement_radiuslocal_smoothing_radius1local_smoothing_radius2local_smoothing_radius3local_smoothing_sigma_sq1local_smoothing_sigma_sq2local_smoothing_sigma_sq3expanded_trimapavg_Favg_Bgathering_Fgathering_Bgathering_alphar   r   r   r   	refined_F	refined_Brefined_alphafinal_Ffinal_Bfinal_alphas                                  [/home/wildlama/miniconda3/lib/python3.13/site-packages/pymatting/alpha/estimate_alpha_sm.pyestimate_alpha_smrG      s)   X ;;2::rzz22u6ghmhshsgt4uu2<<BJJ

33x7ijpjvjviw5xx3<<5;;r?*  p.~  @E  @K  @K  L  La  bh  bn  bn  ao  -p  p*u{{q U[[^q%8l<^_d_j_j^k:ll8 (%&)@%@1%Dq$HCRTRWRWK$X! (%&)@%@1%Dq$HCRTRWRWK$X! LL$E]]2::&FkkmO"'AC'G'*	, S()..A.6ES()..A.6E--&.K--&.KmmF+O-NBB*,. e$Ie$IMM&)M') mmE"GmmE"G--'K'''+++-  $GW,,    zf4(f4[::1], f4[::1], f4[::1])T)cachenogilc                     US   US   -
  nUS   US   -
  nUS   US   -
  nU S   US   -
  nU S   US   -
  nU S   US   -
  nX3-  XD-  -   XU-  -   S-   n	Xc-  Xt-  -   X-  -   U	-  n
[        S[        SU
5      5      n
U
$ )Nr   r   r   h㈵>r	   r   )maxmin)IFBfb0fb1fb2ib0ib1ib2denomalphas              rF   estimate_alpharZ      s    
A$1+C
A$1+C
A$1+C
A$1+C
A$1+C
A$1+CI	!CI-4EY"SY.%7ESe_%ELrH   zf4(f4[::1], f4[::1])c                 X    Sn[        [        U 5      5       H  nX U   X   -  -  nM     U$ )Nr	   )ranger!   )absis       rF   innerra      s0    A3q6]	qTAD[ HrH   c                     [        XU5      nX1S   -  SU-
  US   -  -   U S   -
  nX1S   -  SU-
  US   -  -   U S   -
  nX1S   -  SU-
  US   -  -   U S   -
  nXD-  XU-  -   Xf-  -   $ )Nr   r   r   r   )rZ   )rO   rP   rQ   r]   d0d1d2s          rF   Mp2rf      s    qQA	
qTS1W!$	$qt	+B	
qTS1W!$	$qt	+B	
qTS1W!$	$qt	+B7RWrw&&rH   z/f4(f4[:, :, ::1], i8, i8, f4[::1], f4[::1], i8)c           	         U R                   S S u  pgSn[        X%-
  X%-   S-   5       Hb  n	[        S[        US-
  U	5      5      n	[        X-
  X-   S-   5       H/  n
[        S[        US-
  U
5      5      n
U[	        X	U
4   X45      -  nM1     Md     U$ )Nr   r	   r   r   )r    r\   rM   rN   rf   )r+   xyrP   rQ   rhwresulty2x2s              rF   Nprp      s    ;;r?DAFAE1519%CArN#quqy)BQAE2'Bc%B-..F * &
 MrH   z!f4(f4[:, :, ::1], i8, i8, i8, i8)c           	      L   SnX1-
  nXB-
  n[         R                  " Xg5      nUS:X  a  g[        [         R                  " U5      5      n	[	        S[        SU	5      5      n	Xi-  n
Xy-  nU R                  S S u  p[        U	S-   5       GH  n[        U[        U5      U
-  -   5      n[        U[        U5      U
-  -   5      n[	        S[        US-
  US-
  5      5      n[	        S[        US-
  US-   5      5      n[	        S[        US-
  US-   5      5      n[	        S[        US-
  US-
  5      5      n[	        S[        US-
  U5      5      n[	        S[        US-
  U5      5      nSU UUS4   U UUS4   -
  -  nSU UUS4   U UUS4   -
  -  nSU UUS4   U UUS4   -
  -  nSU UUS4   U UUS4   -
  -  nSU UUS4   U UUS4   -
  -  nSU UUS4   U UUS4   -
  -  nU
U-  UU-  -   nU
U-  UU-  -   nU
U-  UU-  -   nU[         R                  " UU-  UU-  -   UU-  -   5      -  nGM     U$ )Nr	   r   
   r   r   g      ?)
r   hypotintceilrM   rN   r    r\   floatsqrt)r+   pxpysxsyrm   spxspyd	num_stepsstep_xstep_yrk   rl   r`   qxqyq_lq_rq_uq_dIx0Ix1Ix2Iy0Iy1Iy2v0v1v2s                                 rF   Epr      s   F
'C
'C
ACxBGGAJIAs2y)*I_F_F;;r?DA9q=!eAh''(eAh''(!SQQ'(!SQQ'(!SQQ'(!SQQ'(CArN#CArN#U2sA:&r3z)::;U2sA:&r3z)::;U2sA:&r3z)::;U3A:&sBz)::;U3A:&sBz)::;U3A:&sBz)::;c\FSL(c\FSL(c\FSL("''"r'BG+b2g566/ "2 MrH   c                     Sn[        U R                  S   5       H  nX U   X   -
  S-  -  nM     [        R                  " U5      $ )Nr	   r   r   )r\   r    r   rw   )r]   r^   re   r`   s       rF   distr     sC    	B1771:
tad{q   772;rH   zf4(f4[::1])c                 @    [         R                  " [        X 5      5      $ )N)r   rw   ra   )r]   s    rF   lengthr   
  s    775;rH   z3void(f4[:, ::1], f4[:, ::1], f4[:, :, ::1], i8, f4))rI   parallelrJ   c                 x   UR                   u  pV[        XV45       GH  u  pxXU4   S:X  d
  XU4   S:X  a  M  [        R                  n	[	        Xs-
  Xs-   S-   5       H  n
[	        X-
  X-   S-   5       H  nUS:  d  X:  d  U
S:  d  X:  a  M  XU4   S:w  a  XU4   S:w  a  M1  X'US4   X*US4   -
  nX'US4   X*US4   -
  nX'US4   X*US4   -
  n[        R
                  " X-  X-  -   X-  -   5      n[        R                  " X-
  Xz-
  5      nX:  a  M  UU:  a  M  UU	:  d  M  Un	XU4   XU4'   M     M     GM     g )Nr   r   r   )r    r   r   infr\   rw   rs   )r:   r,   r+   r
   r   rk   rl   ri   rh   closestrn   ro   drdgdbcolor_distancespatial_distances                    rF   r%   r%     sc    <<DA! Q$<1!t 18&&1-BAGQWq[16RWQ"'8b&>Q&6b&>Q+>a7^eAI&66a7^eAI&66a7^eAI&66!#27):RW)D!E#%88AFAF#; !'#c)8#g-.G,2r6NOqD)# 2 . !rH   zavoid(f4[:, :, ::1], f4[:, :, ::1], f4[:, ::1], f4[:, :, ::1], f4[:, ::1], i8, f4, f4, f4, f4, i8)c                 @   UR                   u  pS[        X5      -  n[        X45       GH  u  p[        R                  " US4[        R
                  S9n[        R                  " US4[        R                  S9n[        R                  " US4[        R
                  S9n[        R                  " US4[        R                  S9nX>U4   nXNU4   X.U4'   XNU4   S:X  a  UXU4'   M  XNU4   S:X  a  UXU4'   M  SnUU-  UU-  U-  -   nUS-  UU-  -  nS[        R                  -  UU-  -  U-  nSnSn[        U5       GH  nS[        R                  -  U-  U-  U-   n[        R                  " U5      n[        R                  " U5      nS	nS	n[        U5       H  nU(       a
  U(       a    Mo  [        UUU-  -   5      n [        UUU-  -   5      n!U S:  d  U!S:  d  U U:  d  U!U:  a    M  U(       d*  UU!U 4   S:X  a  UU!U 4   UU'   U UUS4'   U!UUS4'   US-  nS
nU(       a  M  UU!U 4   S:X  d  M  UU!U 4   UU'   U UUS4'   U!UUS4'   US-  nS
nM     GM     US:X  a  XU4   UU'   UUUS4'   UUUS4'   US-  nUS:X  a  XU4   UU'   UUUS4'   UUUS4'   US-  n[        R                  n"[        R                  n#[        U5       H'  n[        X?UUUS4   UUS4   5      n$[        U"U$5      n"M)     [        U5       H'  n%[        X?UUU%S4   UU%S4   5      n&[        U#U&5      n#M)     U#U"U#-   S-   -  n'[        R                  n([        U5       H  n[        U5       H  n%UU   n)UU%   n*[        UU)U*5      n+U'SSU'-  -
  U+-  -   n,[        R                   " UUUS4   -
  UUUS4   -
  5      n-[        R                   " UUU%S4   -
  UUU%S4   -
  5      n.[#        X?UU)U*U
5      U-  U,U-  -  U-U-  -  U.U	-  -  n/U(U/:  d  M  U/n(U+X.U4'   U)XU4'   U*XU4'   M     M     GM     g )Nr   r   r   r   r      i        @FTrL   r   )r    rM   r   r   zerosr   int32r"   r\   cossinrt   r   r   rN   rZ   rs   rp   )0r=   r>   r?   r+   r,   r   r   r   r   r   r   rk   rl   	max_stepsri   rh   
fg_samplesfg_samples_xy
bg_samplesbg_samples_xyC_pnr`   start_anglenum_fg_samplesnum_bg_samplesanglecr_   has_fghas_bgstepro   rn   min_Ep_fmin_Ep_bEp_fjEp_bPF_pmin_costrP   rQ   alpha_pApDp_fDp_bg_ps0                                                   rF   r(   r(   -  s    <<DACII! XXz1oRZZ@
*aAXXz1oRZZ@
*aAqDk &!t1Q$<1 #K1Q$<1 #K1 Uq1uk!Y1q5!BEEkQU+a/z"A"%%K*,q0;>EuAuAFFi(feTAX&TAX&6R!VrQw"'5&R.A"516r2vJ~.79M.!"3479M.!"34"a'N!Fv&R.A"516r2vJ~.79M.!"3479M.!"34"a'N!F) ) #> Q)4T):J~&/0M.!+,/0M.!+,aNQ)4T):J~&/0M.!+,/0M.!+,aN6666~&Ae=A#6ad8KLD8T*H '
 ~&Ae=A#6ad8KLD8T*H '
 8h.5666 ~&A>*qMqM(a3S3:-88xxM!Q$$7 7]1a4=P9PQxxM!Q$$7 7]1a4=P9PQ uAq)4b8F"H "H  c>"H,3OqD)()K1%()K1%+ + 's !rH   zkvoid(f4[:, :, ::1], f4[:, :, ::1], f4[:, ::1], f4[:, :, ::1], f4[:, :, ::1], f4[:, :, ::1], f4[:, ::1], i8)c                 v   UR                   u  pX0S S & XAS S & XbS S & [        X45       GH  u  pXZU4   nXjU4   S:X  d
  XjU4   S:X  a  M"  Sn[        R                  " US4[        R                  S9n[        R                  " US4[        R                  S9n[        R                  " U[        R                  S9n[        R
                  US S & [        U* US-   5       H  n[        U* US-   5       H~  nUU-   nU
U-   nSUs=::  a  U	:  d  M  O  M   SUs=::  a  U:  d  M/  O  M3  UUU4   nUUU4   n[        UUU5      n[        R                  " U5      nUUU   :  d  Mo  UUU'   UUU'   UUU'   M     M     UR                  SS9U-  nUR                  SS9U-  nUX
U4'   UXU4'   [        UUU5      X*U4'   GM     g )Nr   r   r   r   r   )r    r   r   r   r   r   r\   rf   argmaxsumrZ   )r@   rA   rB   r=   r>   r+   r,   r   rk   rl   ri   rh   r   max_samplessample_Fsample_Bsample_costdydxro   rn   F_qB_qcostr`   F_meanB_means                              rF   r)   r)     s    <<DAaLaL!! qDkQ$<1!t 188[!,BJJ?88[!,BJJ?hh{"**=A!,BVGVaZ0VV;Q;;1;Q;;%b"f-C%b"f-CsC-D		+.Ak!n,)-A&)&) 1 -$ 1%31%3 	Q$ 	Q$,S&&AdI !rH   zvoid(f4[:, :, ::1], f4[:, :, ::1], f4[:, ::1], f4[:, :, ::1], f4[:, :, ::1], f4[:, ::1], f4[:, :, ::1], f4[:, ::1], i8, i8, i8, f4, f4, f4)c                 	   UR                   u  p[        R                  " X4[        R                  S9n[        R                  " X4[        R                  S9n[        R                  " X4[        R                  S9nX0S S & XAS S & [	        X45       GH  u  nnUUU4   nUUU4   S:X  d  UUU4   S:X  a  M&  [        R                  " S[        R                  S9n[        R                  " S[        R                  S9nSnSnUUU4   n[        U* US-   5       GH  n[        U* US-   5       H  nUU-   nUU-   nSUs=::  a  U:  d  M  O  M   SUs=::  a  U:  d  M/  O  M3  [        R                  " SU-  UU-  UU-  -   -  5      nUU:w  d  UU:w  a  U[        UUU4   UUU4   -
  5      -  nUUU4   n UU -  n!USU -
  -  n"[        U!S5      n![        U"S5      n"UU!-  nUU"-  n[        S5       H/  n#UU#==   U!UUUU#4   -  -  ss'   UU#==   U"UUUU#4   -  -  ss'   M1     M     GM     UU-  nUU-  nUU UU4'   UUUU4'   [        UUU5      UUU4'   USU-
  -  UUU4'   GM     [	        X45       GH@  u  nnUUU4   nUUU4   S:X  d  UUU4   S:X  a  UUU4   UUU4'   M2  Sn$Sn%[        U	* U	S-   5       Hu  n[        U	* U	S-   5       H^  nUU-   nUU-   nSUs=::  a  U:  d  M  O  M   SUs=::  a  U:  d  M/  O  M3  U%UUU4   -  n%U$UUU4   [        U UU4   UUU4   5      -  -  n$M`     Mw     U$U%S-   -  n$U$S-  n$[        U UU4   UUU4   5      n&U UU4   nUUU4   n[        SU&U$-  5      [        R                  " SU-  [        R                  " [        UUU5      5      -  5      -  UUU4'   GMC     [	        X45       GH  u  nnUUU4   S:X  d  UUU4   S:X  a  UUU4   UUU4'   M+  Sn'Sn%[        U
* U
S-   5       H  n[        U
* U
S-   5       H  nUU-   nUU-   nSUs=::  a  U:  d  M  O  M   SUs=::  a  U:  d  M/  O  M3  UU-  UU-  -   n(UUU4   S:H  =(       d
    UUU4   S:H  n)[        R                  " SU-  UU-  UU-  -   -  5      U)-   n*U'U*UUU4   -  -  n'U%U*-  n%M     M     U'U%-  UUU4'   UUU4   UUU4   -  SUUU4   -
  UUU4   -  -   UUU4'   GM!     g )	Nr   r   r   r   r	   g      r   rL   )r    r   r   r   r   r\   expabsrM   rZ   r   rN   rw   rf   )+rC   rD   rE   r@   rA   rB   r+   r,   r   r   r   r   r   r   rk   rl   final_confidenceW_FBlow_frequency_alphari   rh   r   F_pB_psum_Fsum_Br   r   r   ro   rn   Wc_pqalpha_qW_FW_Br   D_FB
weight_sumFB_dist	alpha_sumD_image_squaredis_knownW_alphas+                                              rF   r*   r*     s   " <<DAxxbjj988QF"**-D((A6<AJAJ! 1AqDk!Q$<1q!t 1hhq

+hhq

+1%'A+.BWHgk2VV;Q;;1;Q;;FF4)#3rBwb7H#IJEBw!r']1a4%8=R;P%P!QQ+BF3G'/C3=1Cc4.Cc4.CSLESLE"1XA#	"b!)(<"<<A#	"b!)(<"<< &- 3 /6 	uu11*3S9AqD g.QT
e !h ! 1AqDk!Q$<1q!t 1%+AqD\QT"
'A+.BWHgk2VV;Q;;1;Q;;$r2v,.JDRL4BR+QQQD 3 / 	
T!!wq!t}gadm4admadm!$S'D.!9BFF4)CSVXV]V]^abegjlo^pVqCq<r!rA3 !6 ! 1!Q$<1q!t 1 &q!tK1	
'A+.BWHgk2VV;Q;;1;Q;;&(2gR&7O%b"f~2IfRVn6IH ffTI%5b279J%KLxWG=R+@!@@I')J 3 / %.
$:AqD!,QT2[A5FF#P`abdeaePfJfj}~  BC  C  kD  JD  DAqD+ !rH   )Frr   g{Gz?   )g      @r   r   g      @r      r   r   r   Ng?N)numbar   r   numpyr   rG   rZ   ra   rf   rp   r   r   r   r%   r(   r)   r*    rH   rF   <module>r      s     
 "'#1 "!"aF %T> ?" D5 6 %T>' ?' 7t4P Q )TB+ C+Z D5 6 m4t,  -  ;4RV^bc; d;< iqu  AE  MQ  R@* R@*D s{  KP  X\  ]4B ]4Bl   T  \`  ko  w{  |}D |}DrH   