
    |h8                         d Z ddlm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mZ d Zddddddej*                  ddZd Zddddej*                  ddZy)z,TV-L1 optical flow algorithm implementation.    )partial)combinations_with_replacementN)ndimage   )gaussian)_supported_float_type)warp   )_coarse_to_fine_get_warp_pointsc	                    | j                   }	t        j                  | j                  D 
cg c]  }
t        j                  |
|	       c}
ddd}d| j
                  z  }d}||z  }||z  }|| j                  z  }|x}}t        j                  | j
                  f| j                  z   |	      }t        j                  | j
                  | j
                  f| j                  z   |	      }t        d      g|j
                  z  }t        d      g|j
                  z  }t        d      g|j
                  dz
  z  }t        |      D ]	  }|r(t        j                  |dg| j
                  d	gz  z         }t        |t        ||      d
      }t        j                  t        j                  |            }||z  j!                  d      }d||dk(  <   || z
  ||z  j!                  d      z
  }t        |      D ]7  }|||z  j!                  d      z   }t#        |      ||z  k  }|}|dd|fxx   ||   |dd|f   z  ||   z  z  cc<   | }|t        j$                  ||         z  }|dd|fxx   ||dd|f   z  z  cc<   |j'                         }t        | j
                        D ]  }||d<   t        |      D ]m  }t        | j
                        D ]P  } | |d<   t        dd      || dz   <   t        j(                  ||   |       |t+        |      <   t        d      || dz   <   R t        j,                  |dz  j!                  d            t        j.                  df   }!|!|z  }!|!dz  }!||xx   ||z  z  cc<   ||xx   |!z  cc<   ||   j!                  d       }"t        | j
                        D ]i  } | |d<   t        dd      || dz   <   t        dd      || <   |"t+        |      xx   |t+        |         z  cc<   t        d      || dz   <   t        d      || <   k ||   |"z   ||<   p  : ||z  }||z  j!                         |k  r |S |} |S c c}
w )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#                                      a/var/www/html/test/engine/venv/lib/python3.12/site-packages/skimage/registration/_optical_flow.py_tvl1rS      s   \ !!E;;-<-B-B	C"))AU
#	CD 
##	#BL	i	B	i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 2!#A&+ArlBF(*S0A(K%*&+DkBF	2 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%/@@%+	@Z 	%M)..036  %A@%D I 
Ds   Q   g333333?   
   g-C6?F)r3   r4   r5   r6   r7   r8   r   c          	          t        t        ||||||      }	t        j                  |      t	        |      k7  rd| d}
t        |
      t        | ||	|      S )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]      sf    j F 
xx/66ugKLo?L&NN    c           	         | j                   }| j                  }d|z  dz   }	|r||	dz  fz  }
t        t        |
d      }n t        t        j
                  ||	fz  d      }|}t        j                  | j                  ||fz   |      }t        j                  | j                  |dfz   |      }t        j                  | j                  D cg c]  }t        j                  ||       c}dd	d
}t        |      D ]`  }|rt	        j                  |d|dz  z         }t        |t        ||      d      }t        j                  t        j                   |      d      }||z  j#                  d      | z   |z
  }t%        t        |      d      D ]$  \  }} |||   ||   z        x|d||f<   |d||f<   & t        |      D ]  } |||   |z        |d|df<    t'        t        j(                  j+                  |            dk  }t        j,                  ||      ||<   d||<   t        j.                  t        j(                  j1                  ||      d   |d      }c |S c c}w )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     s[   8 !!EDv:>Dq{"oUJc00ttg~HUD 	&&$5UCA
&&$2%@A;;-<-B-B	C"))AU
#	CD 8_ C$$T4$++=>D *46V
 xx$56Q?d{''Q'//ADUU 2%+qA 	IDAq*5d1gQ6G*HHAc1aiL1S!QY<	I t 	>A&tAw'<=Ac1aiL	> "))--"#e+E*## {{299??1a08$B/C2 K= 
Ds   
I!   )rk   r5   r   r8   r   c                    t        t        ||||      }t        j                  |      t	        |      k7  rd| d}t        |      t        | |||      S )a9
  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   [  s\    T VhYF 
xx/66ugKLo?L&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^   