U
    !?h                     @   sh   d dl Zd dlmZmZ edddddd Zeddddd	d
 Zeddddddd Zdd ZdS )    N)njitprangez(f8[:],)T)cachenogilc                 C   sv   t | }td|D ]&}|d }t| | | | d | |< qt|d ddD ]&}|d }t| | | | d | |< qJd S )N      )lenrangemin)dni1i2 r   I/var/www/html/venv/lib/python3.8/site-packages/pymatting/util/distance.py_propagate_1d_first_pass   s    r   z(f8[:], i4[:], f8[:], f8[:])c                 C   s"  t | }d}tj }t|D ]}| | }|tjkr4q|| }	|	||< |dkr|| }
d|	||  ||
  |
|
   ||
  }||| krq|d8 }qD|d7 }|||< |||< tj||d < q|dk rd S d}t|D ]H}||d  |k r|d7 }q|| }
||
 }t|| ||
  | |< qd S )Nr   r   g      ?r   )r	   npinfr
   sqrt)r   vzfnxksxZd_yxZfxZvkZdxr   r   r   _propagate_1d   s8    
(

r   z(f8[:, :],))r   parallelr   c                 C   s   | j \}}t|D ]}t| d d |f  qtj||ftjd}t||d f}t||f}t|D ]"}t| | || || ||  qhd S )N)dtyper   )shaper   r   r   zerosZint32r   )distancenyr   r   r   r   r   yr   r   r   _propagate_distance=   s    
r%   c                 C   sF   | j tjkr| dk} | j\}}t||ftj}tj|| < t| |S )a  
    For every non-zero value, compute the distance to the closest zero value.
    Based on :cite:`felzenszwalb2012distance`.

    Parameters
    ----------
    mask: numpy.ndarray
        2D matrix of zero and nonzero values.

    Returns
    -------
    distance: numpy.ndarray
        Distance to closest zero-valued pixel.

    Example
    -------
    >>> from pymatting import *
    >>> import numpy as np
    >>> mask = np.random.rand(10, 20) < 0.9
    >>> distance = distance_transform(mask)
    r   )r   r   Zbool_r    r!   Zfloat64r   r%   )maskr#   r   r"   r   r   r   distance_transformL   s    

r'   )	numpyr   Znumbar   r   r   r   r%   r'   r   r   r   r   <module>   s   

+
