
    9i8                         S r SSKJr  SSKJr  SSKrSSKJr	  SSK
Jr  SSKJr  SS	KJr  S
SKJrJr  S rSSSSSS\R*                  S.S jrS rSSSS\R*                  S.S jrg)z,TV-L1 optical flow algorithm implementation.    )partial)combinations_with_replacementN)ndimage   )gaussian)_supported_float_type)warp   )_coarse_to_fine_get_warp_pointsc	                    U R                   n	[        R                  " U R                   V
s/ s H  n
[        R                  " XS9PM     sn
SSS.6nSU R
                  -  nSnX4-  nX-  nXpR                  -  nU=nn[        R                  " U R
                  4U R                  -   U	S9n[        R                  " U R
                  U R
                  4U R                  -   U	S9n[        S5      /UR
                  -  n[        S5      /UR
                  -  n[        S5      /UR
                  S-
  -  n[        U5       GH  nU(       a)  [        R                  " US/U R
                  S	/-  -   5      n[        U[        UU5      S
S9n[        R                  " [        R                  " U5      5      nUU-  R!                  S5      nSUUS:H  '   UU -
  UU-  R!                  S5      -
  n[        U5       GH@  nUUU-  R!                  S5      -   n[#        U5      UU-  :*  nUnUSS2U4==   UU   USS2U4   -  UU   -  -  ss'   U) nU[        R$                  " UU   5      -  nUSS2U4==   UUSS2U4   -  -  ss'   UR'                  5       n[        U R
                  5       GH  nUUS'   [        U5       GHq  n[        U R
                  5       HO  n U US'   [        SS5      UU S-   '   [        R(                  " UU   U S9U[+        U5      '   [        S5      UU S-   '   MQ     [        R,                  " US-  R!                  S5      5      [        R.                  S4   n!U!U-  n!U!S-  n!UU==   UU-  -  ss'   UU==   U!-  ss'   UU   R!                  S5      * n"[        U R
                  5       Hj  n U US'   [        SS5      UU S-   '   [        SS5      UU '   U"[+        U5      ==   U[+        U5         -  ss'   [        S5      UU S-   '   [        S5      UU '   Ml     UU   U"-   UU'   GMt     GM     GMC     UU-  nUU-  R!                  5       U:  a    U$ UnGM     U$ s  sn
f )u>  TV-L1 solver for optical flow estimation.

Parameters
----------
reference_image : ndarray, shape (M, N[, P[, ...]])
    The first grayscale image of the sequence.
moving_image : ndarray, shape (M, N[, P[, ...]])
    The second grayscale image of the sequence.
flow0 : ndarray, shape (image0.ndim, M, N[, P[, ...]])
    Initialization for the vector field.
attachment : float
    Attachment parameter. The smaller this parameter is,
    the smoother is the solutions.
tightness : float
    Tightness parameter. It should have a small value in order to
    maintain attachment and regularization parts in
    correspondence.
num_warp : int
    Number of times moving_image is warped.
num_iter : int
    Number of fixed point iteration.
tol : float
    Tolerance used as stopping criterion based on the L² distance
    between two consecutive values of (u, v).
prefilter : bool
    Whether to prefilter the estimated optical flow before each
    image warp.

Returns
-------
flow : ndarray, shape (image0.ndim, M, N[, P[, ...]])
    The estimated optical flow components for each axis.

dtypeijTindexingsparseg      ?r   Nr
      edgemoder   axis.g      ?)r   npmeshgridshapearangendimsizezerosslicerangendimedian_filterr	   r   arraygradientsumabssigncopydifftuplesqrtnewaxis)#reference_imagemoving_imageflow0
attachment	tightnessnum_warpnum_itertol	prefilterr   ngriddtreg_num_iterf0f1flow_currentflow_previousgprojs_gs_ps_d_image1_warpgradNIrho_0rhoidxflow_auxiliarysrhoaxnormds#                                      b/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/skimage/registration/_optical_flow.py_tvl1rS      s|   \ !!E;;-<-B-B	C-B"))A
#-B	CD 
##	#BL		B	BC#((L=
/&&(?+@+@@NA88    	
 

		 
 D 	d	C 	d		C 	d	QC 8_,,qcO$8$8A3$>>L *4>V
 xxK01Tkq!27o-1D0I0I!0LLxA 4,.33A66Cc(b2g%C)N1c6"c#haf&=3&GG"$CC))D1c6"dT!S&\&99" *..0L_112A|,A#O$8$89!#A&+ArlBF(*S0A(K%*&+DkBF	 : 77AqD::a=1"**c/BDBJDCKDIa'II%I cq))A#O$8$89!#A&+ArlBF"'4.B%*eCj)99&+DkBF"'+B : )7s(;a(?L%/ - 3% !Z 	%M)..036  %A D I 
Ds   Q   g333333?   
   g-C6?F)r3   r4   r5   r6   r7   r8   r   c          
          [        [        UUUUUUS9n	[        R                  " U5      [	        U5      :w  a  SU S3n
[        U
5      e[        XXS9$ )u
  Coarse to fine optical flow estimator.

The TV-L1 solver is applied at each level of the image
pyramid. TV-L1 is a popular algorithm for optical flow estimation
introduced by Zack et al. [1]_, improved in [2]_ and detailed in [3]_.

Parameters
----------
reference_image : ndarray, shape (M, N[, P[, ...]])
    The first grayscale image of the sequence.
moving_image : ndarray, shape (M, N[, P[, ...]])
    The second grayscale image of the sequence.
attachment : float, optional
    Attachment parameter (:math:`\lambda` in [1]_). The smaller
    this parameter is, the smoother the returned result will be.
tightness : float, optional
    Tightness parameter (:math:`\theta` in [1]_). It should have
    a small value in order to maintain attachment and
    regularization parts in correspondence.
num_warp : int, optional
    Number of times moving_image is warped.
num_iter : int, optional
    Number of fixed point iteration.
tol : float, optional
    Tolerance used as stopping criterion based on the L² distance
    between two consecutive values of (u, v).
prefilter : bool, optional
    Whether to prefilter the estimated optical flow before each
    image warp. When True, a median filter with window size 3
    along each axis is applied. This helps to remove potential
    outliers.
dtype : dtype, optional
    Output data type: must be floating point. Single precision
    provides good results and saves memory usage and computation
    time compared to double precision.

Returns
-------
flow : ndarray, shape (image0.ndim, M, N[, P[, ...]])
    The estimated optical flow components for each axis.

Notes
-----
Color images are not supported.

References
----------
.. [1] Zach, C., Pock, T., & Bischof, H. (2007, September). A
   duality based approach for realtime TV-L 1 optical flow. In Joint
   pattern recognition symposium (pp. 214-223). Springer, Berlin,
   Heidelberg. :DOI:`10.1007/978-3-540-74936-3_22`
.. [2] Wedel, A., Pock, T., Zach, C., Bischof, H., & Cremers,
   D. (2009). An improved algorithm for TV-L 1 optical flow. In
   Statistical and geometrical approaches to visual motion analysis
   (pp. 23-45). Springer, Berlin, Heidelberg.
   :DOI:`10.1007/978-3-642-03061-1_2`
.. [3] Pérez, J. S., Meinhardt-Llopis, E., & Facciolo,
   G. (2013). TV-L1 optical flow estimation. Image Processing On
   Line, 2013, 137-150. :DOI:`10.5201/ipol.2013.26`

Examples
--------
>>> from skimage.color import rgb2gray
>>> from skimage.data import stereo_motorcycle
>>> from skimage.registration import optical_flow_tvl1
>>> image0, image1, disp = stereo_motorcycle()
>>> # --- Convert the images to gray level: color is not supported.
>>> image0 = rgb2gray(image0)
>>> image1 = rgb2gray(image1)
>>> flow = optical_flow_tvl1(image1, image0)

)r3   r4   r5   r6   r7   r8   dtype=. is not supported. Try 'float32' or 'float64.'r   )r   rS   r   r   r   
ValueErrorr   )r0   r1   r3   r4   r5   r6   r7   r8   r   solvermsgs              rR   optical_flow_tvl1r]      sb    j F 
xx/66ugKLo?&NN    c           
         U R                   nU R                  nSU-  S-   n	U(       a  XS-  4-  n
[        [        U
SS9nO[        [        R
                  X4-  SS9nUn[        R                  " U R                  X4-   US9n[        R                  " U R                  US4-   US9n[        R                  " U R                   Vs/ s H  n[        R                  " XS9PM     snSS	S
.6n[        U5       GHa  nU(       a  [        R                  " USUS-  -   5      n[        U[        UU5      SS9n[        R                  " [        R                   " U5      SS9nUU-  R#                  SS9U -   U-
  n[%        [        U5      S5       H%  u  nnU" UU   UU   -  5      =USUU4'   USUU4'   M'     [        U5       H  nU" UU   U-  5      USUS4'   M     ['        [        R(                  R+                  U5      5      S:  n[        R,                  " XS9UU'   SUU'   [        R.                  " [        R(                  R1                  X5      S   US5      nGMd     U$ s  snf )a  Iterative Lucas-Kanade (iLK) solver for optical flow estimation.

Parameters
----------
reference_image : ndarray, shape (M, N[, P[, ...]])
    The first grayscale image of the sequence.
moving_image : ndarray, shape (M, N[, P[, ...]])
    The second grayscale image of the sequence.
flow0 : ndarray, shape (reference_image.ndim, M, N[, P[, ...]])
    Initialization for the vector field.
radius : int
    Radius of the window considered around each pixel.
num_warp : int
    Number of times moving_image is warped.
gaussian : bool
    if True, a gaussian kernel is used for the local
    integration. Otherwise, a uniform kernel is used.
prefilter : bool
    Whether to prefilter the estimated optical flow before each
    image warp. This helps to remove potential outliers.

Returns
-------
flow : ndarray, shape (reference_image.ndim, M, N[, P[, ...]])
    The estimated optical flow components for each axis.

r   r
      mirror)sigmar   )r    r   r   r   Tr   )r
   )r   r   r   r   r   .g+=).r   )r   r   r   gaussian_filterr$   uniform_filterr   r!   r   r   r   r#   r%   r	   r   stackr'   r(   r   r)   linalgdeteyemoveaxissolve)r0   r1   r2   radiusr5   r   r8   r   r   r    rb   filter_funcflowAbr9   r:   rF   moving_image_warprH   error_imageijrL   s                           rR   _ilkrt     sC   8 !!EDv:>Dq{"oUJc00tg~HUD 	&&$5UCA
&&$2%@A;;-<-B-B	C-B"))A
#-B	CD 8_$$T4$++=>D *46V
 xx$56Q?d{''Q'//ADUU 2%+qADAq*5d1gQ6G*HHAc1aiL1S!QY< B tA&tAw'<=Ac1aiL  "))--"#e+*## {{299??108$B/ 2 K= 
Ds   I   )rk   r5   r   r8   r   c                    [        [        X#XES9n[        R                  " U5      [	        U5      :w  a  SU S3n[        U5      e[        XXvS9$ )a]	  Coarse to fine optical flow estimator.

The iterative Lucas-Kanade (iLK) solver is applied at each level
of the image pyramid. iLK [1]_ is a fast and robust alternative to
TVL1 algorithm although less accurate for rendering flat surfaces
and object boundaries (see [2]_).

Parameters
----------
reference_image : ndarray, shape (M, N[, P[, ...]])
    The first grayscale image of the sequence.
moving_image : ndarray, shape (M, N[, P[, ...]])
    The second grayscale image of the sequence.
radius : int, optional
    Radius of the window considered around each pixel.
num_warp : int, optional
    Number of times moving_image is warped.
gaussian : bool, optional
    If True, a Gaussian kernel is used for the local
    integration. Otherwise, a uniform kernel is used.
prefilter : bool, optional
    Whether to prefilter the estimated optical flow before each
    image warp. When True, a median filter with window size 3
    along each axis is applied. This helps to remove potential
    outliers.
dtype : dtype, optional
    Output data type: must be floating point. Single precision
    provides good results and saves memory usage and computation
    time compared to double precision.

Returns
-------
flow : ndarray, shape (reference_image.ndim, M, N[, P[, ...]])
    The estimated optical flow components for each axis.

Notes
-----
- The implemented algorithm is described in **Table2** of [1]_.
- Color images are not supported.

References
----------
.. [1] Le Besnerais, G., & Champagnat, F. (2005, September). Dense
   optical flow by iterative local window registration. In IEEE
   International Conference on Image Processing 2005 (Vol. 1,
   pp. I-137). IEEE. :DOI:`10.1109/ICIP.2005.1529706`
.. [2] Plyer, A., Le Besnerais, G., & Champagnat,
   F. (2016). Massively parallel Lucas Kanade optical flow for
   real-time video processing applications. Journal of Real-Time
   Image Processing, 11(4), 713-730. :DOI:`10.1007/s11554-014-0423-0`

Examples
--------
>>> from skimage.color import rgb2gray
>>> from skimage.data import stereo_motorcycle
>>> from skimage.registration import optical_flow_ilk
>>> reference_image, moving_image, disp = stereo_motorcycle()
>>> # --- Convert the images to gray level: color is not supported.
>>> reference_image = rgb2gray(reference_image)
>>> moving_image = rgb2gray(moving_image)
>>> flow = optical_flow_ilk(moving_image, reference_image)

)rk   r5   r   r8   rX   rY   r   )r   rt   r   r   r   rZ   r   )	r0   r1   rk   r5   r   r8   r   r[   r\   s	            rR   optical_flow_ilkrw   [  sT    T VF 
xx/66ugKLo?&NNr^   )__doc__	functoolsr   	itertoolsr   numpyr   scipyr   r$   _shared.filtersr   rc   _shared.utilsr   	transformr	   _optical_flow_utilsr   r   rS   float32r]   rt   rw    r^   rR   <module>r      sm    2  3    9 1  BTv 
**cOLLf 
**ROr^   