o
    ;ήc>                     @   s  d dl Z d dlmZ d dlmZmZmZ d dlZd dl	m
Z
mZmZmZmZm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 d d	lmZ d
dlmZ d
dlmZ eedZ G dd deZ!dedede"de"de"defddZ#dededefddZ$dee defddZ%dededefdd Z&dej'dej'fd!d"Z(	#	$	%	%		#	#d0d&ee)eej'f d'e*d(e"d)e"d*e"d+ee d,e*d-e*dee)eej'f fd.d/Z+dS )1    N)Enum)ListOptionalUnion)BORDER_DEFAULTMORPH_ELLIPSE
MORPH_OPENGaussianBlurgetStructuringElementmorphologyEx)Image)estimate_alpha_cf)estimate_foreground_ml)stack_images)binary_erosion   )BaseSession)new_session)   r   c                   @   s   e Zd ZdZdZdZdS )
ReturnTyper   r      N)__name__
__module____qualname__BYTESPILLOWNDARRAY r   r   //tmp/pip-target-vg8gfxp4/lib/python/rembg/bg.pyr      s    r   imgmaskforeground_thresholdbackground_thresholderode_structure_sizereturnc                 C   s   | j dks
| j dkr| d} t| } t|}||k}||k }d }|dkr1tj||ftjd}t||d}t||dd}tj|jtjd	d
}d||< d||< | d }	|d }
t	|	|
}t
|	|}t||}t|d ddtj}t|}|S )NRGBACMYKRGBr   )dtype)	structurer   )r)   border_value   )r(   
fill_value   g     o@)modeconvertnpasarrayonesuint8r   fullshaper   r   r   clipastyper   	fromarray)r   r    r!   r"   r#   is_foregroundis_backgroundr)   trimapimg_normalizedtrimap_normalizedalpha
foregroundcutoutr   r   r   alpha_matting_cutout!   s0   







rA   c                 C   s"   t d| jd}t | ||}|S )Nr%   r   )r   newsize	composite)r   r    emptyr@   r   r   r   naive_cutoutL   s   rF   imgsc                 C   s"   |  d}| D ]}t||}q|S )Nr   )popget_concat_v)rG   pivotimr   r   r   get_concat_v_multiR   s   
rL   img1img2c                 C   s<   t d| j| j|j f}|| d ||d| jf |S )Nr%   )r   r   r   )r   rB   widthheightpaste)rM   rN   dstr   r   r   rI   Y   s   rI   c                 C   s<   t | tt} t| dddtd} t| dk ddtj} | S )z
    Post Process the mask for a smooth boundary by applying Morphological Operations
    Research based on paper: https://www.sciencedirect.com/science/article/pii/S2352914821000757
    args:
        mask: Binary Numpy Mask
    )   rS   r   )sigmaXsigmaY
borderType   r   r-   )	r   r   kernelr	   r   r0   wherer7   r3   )r    r   r   r   post_process`   s   rZ   F   
   dataalpha_matting"alpha_matting_foreground_threshold"alpha_matting_background_thresholdalpha_matting_erode_sizesession	only_maskpost_process_maskc              	   C   s\  t | trtj}| }	n)t | trtj}tt	| }	nt | t
jr+tj}t| }	n	tdt| |d u r<td}||	}
g }|
D ]8}|rSttt
|}|rX|}n |rsz
t|	||||}W n tyr   t|	|}Y nw t|	|}|| qE|	}t|dkrt|}tj|kr|S tj|krt
|S t	 }||d |d | S )NzInput type {} is not supported.u2netr   PNG)
isinstancePILImager   r   bytesr   r   openioBytesIOr0   ndarrayr   r8   
ValueErrorformattyper   predictrZ   arrayrA   rF   appendlenrL   r1   saveseekread)r]   r^   r_   r`   ra   rb   rc   rd   return_typer   maskscutoutsr    r@   bior   r   r   removem   sX   







r|   )Fr[   r\   r\   NFF),rk   enumr   typingr   r   r   numpyr0   cv2r   r   r   r	   r
   r   PILr   	PIL.Imagerh   !pymatting.alpha.estimate_alpha_cfr   +pymatting.foreground.estimate_foreground_mlr   pymatting.util.utilr   scipy.ndimager   session_baser   session_factoryr   rX   r   intrA   rF   rL   rI   rm   rZ   ri   boolr|   r   r   r   r   <module>   st     

+	