U
    !?hÓ  ã                   @   s"   d dl mZ d dlZddd„ZdS )é    )Útrimap_splitNç      Y@Fc                 C   sl   |j dd… \}}t|ƒ\}}}}	|| }
|| }tj |
¡}| | }| ¡ }| ¡  |rd|||
fS ||fS )a  This function constructs a linear system from a matting Laplacian by
    constraining the foreground and background pixels with a diagonal matrix
    `C` to values in the right-hand-side vector `b`. The constraints are
    weighted by a factor :math:`\lambda`. The linear system is given as

    .. math::

      A = L + \lambda C,

    where :math:`C=\mathop{Diag}(c)` having :math:`c_i = 1` if pixel i is known
    and :math:`c_i = 0` otherwise.
    The right-hand-side :math:`b` is a vector with entries :math:`b_i = 1` is
    pixel is is a foreground pixel and :math:`b_i = 0` otherwise.


    Parameters
    ----------
    L: scipy.sparse.spmatrix
        Laplacian matrix, e.g. calculated with :code:`lbdm_laplacian` function
    trimap: numpy.ndarray
        Trimap with shape :math:`h\times w`
    lambda_value: float
        Constraint penalty, defaults to 100
    return_c: bool
        Whether to return the constraint matrix `C`, defaults to False

    Returns
    -------
    A: scipy.sparse.spmatrix
        Matrix describing the system of linear equations
    b: numpy.ndarray
        Vector describing the right-hand side of the system
    C: numpy.ndarray
        Vector describing the diagonal entries of the matrix `C`, only returned
        if `return_c` is set to True
    Né   )Úshaper   ÚscipyÚsparseZdiagsZtocsrZsum_duplicates)ÚLZtrimapZlambda_valueZreturn_cÚhÚwZis_fgZis_bgZis_knownZ
is_unknownÚcÚbÚCÚA© r   úO/var/www/html/venv/lib/python3.8/site-packages/pymatting/laplacian/laplacian.pyÚmake_linear_system   s    %
r   )r   F)Zpymatting.util.utilr   Zscipy.sparser   r   r   r   r   r   Ú<module>   s   