o
    :ήc                     @   sx   d dl mZ 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 Z	edddZ
dS )    )apply_to_channelsN)njitprangezf8[:, :](f8[:, :], i8)T)cacheparallelc           	      C   s   | j \}}t||d|  f}t|D ]R}tdD ] }d}t||d|  d D ]
}|| ||f 7 }q)||||f< qtd|j d D ]"}|d }|| ||f 8 }|d|  }|| ||f 7 }||||f< qCq|S N              shapenpzerosr   range	srcrmndstij_dstsj_src r   ?/tmp/pip-target-vg8gfxp4/lib/python/pymatting/util/boxfilter.pyboxfilter_rows_valid   s    
	r   c           	      C   s*  | j \}}t||f}t|D ]}tdD ]}d}t|| d D ]
}|| ||f 7 }q"||||f< qtd|d D ]}|| ||| f 7 }||||f< q;t|d || D ]}|| ||| d f 8 }|| ||| f 7 }||||f< qWt|| |D ]}|| ||| d f 8 }||||f< q}q|S )Nr	   r
   r   r   r   r   r   boxfilter_rows_same   s(   
r   c           	      C   sX  | j \}}t||d|  f}t|D ]}tdD ]}d}t|| d | D ]
}|| ||f 7 }q(||||f< qtdd| d D ]}|| ||f 7 }||||f< qCtd| d |j d d|  D ]}|| ||| | d f 8 }|| ||f 7 }||||f< qdt|j d d|  |j d D ]}|| ||| | d f 8 }||||f< qq|S r   r   r   r   r   r   boxfilter_rows_full<   s(   
$"r      samec                 C   s   |dksJ |dv sJ | j d d| d ksJ | j d d| d ks&J tttd| }| j}|||}|j}|||}|S )aU  Computes the boxfilter (uniform blur, i.e. blur with kernel :code:`np.ones(radius, radius)`) of an input image.

    Depending on the mode, the input image of size :math:`(h, w)` is either of shape

    * :math:`(h - 2 r, w - 2 r)` in case of 'valid' mode
    * :math:`(h, w)` in case of 'same' mode
    * :math:`(h + 2 r, w + 2 r)` in case of 'full' mode

    .. image:: figures/padding.png

    Parameters
    ----------
    src: numpy.ndarray
        Input image having either shape :math:`h \times w \times d`  or :math:`h \times w`
    radius: int
        Radius of boxfilter, defaults to :math:`3`
    mode: str
        One of 'valid', 'same' or 'full', defaults to 'same'

    Returns
    -------
    dst: numpy.ndarray
        Blurred image

    Example
    -------
    >>> from pymatting import *
    >>> import numpy as np
    >>> boxfilter(np.eye(5), radius=2, mode="valid")
    array([[5.]])
    >>> boxfilter(np.eye(5), radius=2, mode="same")
    array([[3., 3., 3., 2., 1.],
           [3., 4., 4., 3., 2.],
           [3., 4., 5., 4., 3.],
           [2., 3., 4., 4., 3.],
           [1., 2., 3., 3., 3.]])
    >>> boxfilter(np.eye(5), radius=2, mode="full")
    array([[1., 1., 1., 1., 1., 0., 0., 0., 0.],
           [1., 2., 2., 2., 2., 1., 0., 0., 0.],
           [1., 2., 3., 3., 3., 2., 1., 0., 0.],
           [1., 2., 3., 4., 4., 3., 2., 1., 0.],
           [1., 2., 3., 4., 5., 4., 3., 2., 1.],
           [0., 1., 2., 3., 4., 4., 3., 2., 1.],
           [0., 0., 1., 2., 3., 3., 3., 2., 1.],
           [0., 0., 0., 1., 2., 2., 2., 2., 1.],
           [0., 0., 0., 0., 1., 1., 1., 1., 1.]])

    r   )validr    fullr   r	   )r   r   r   r   T)r   radiusmodeboxfilter_rowstmpr   r   r   r   	boxfilterY   s   2

r(   )r   r    )pymatting.util.utilr   numpyr   numbar   r   r   r   r   r(   r   r   r   r   <module>   s    


