Spaces:
Runtime error
Runtime error
from PIL import Image,ImageOps | |
from rembg import new_session | |
import numpy as np | |
import cv2 | |
class BackgroundRemover: | |
def __init__(self,model_name="unetp"): | |
self.session = new_session(model_name) | |
def read_image(self,path): | |
""" | |
Read the image. | |
Args: | |
path (str): The image path. | |
Returns: | |
PILImage: Original Image . | |
""" | |
image = Image.open(path) | |
return image | |
def resize_image(self,image,width,height): | |
""" | |
Resize the image. | |
Args: | |
img (PILImage): The image to be modified. | |
width (int): The width of the image. | |
height (int): The height of the image. | |
Returns: | |
PILImage: The resized image . | |
""" | |
image = image.resize((width,height)) | |
return image | |
def putalpha_cutout(self,img, mask): | |
""" | |
Apply the specified mask to the image as an alpha cutout. | |
Args: | |
img (PILImage): The image to be modified. | |
mask (PILImage): The mask to be applied. | |
Returns: | |
PILImage: The modified image with the alpha cutout applied. | |
""" | |
img.putalpha(mask) | |
return img | |
def get_concat_v(self,img1, img2): | |
""" | |
Concatenate two images vertically. | |
Args: | |
img1 (PILImage): The first image. | |
img2 (PILImage): The second image to be concatenated below the first image. | |
Returns: | |
PILImage: The concatenated image. | |
""" | |
dst = Image.new("RGBA", (img1.width, img1.height + img2.height)) | |
dst.paste(img1, (0, 0)) | |
dst.paste(img2, (0, img1.height)) | |
return dst | |
def get_concat_v_multi(self,imgs): | |
""" | |
Concatenate multiple images vertically. | |
Args: | |
imgs (List[PILImage]): The list of images to be concatenated. | |
Returns: | |
PILImage: The concatenated image. | |
""" | |
pivot = imgs.pop(0) | |
for im in imgs: | |
pivot = self.get_concat_v(pivot, im) | |
return pivot | |
def apply_background(self,img,filepath,w,h): | |
""" | |
Apply the specified background color to the image. | |
Args: | |
img (PILImage): The image to be modified. | |
color (Tuple[int, int, int, int]): The RGBA color to be applied. | |
Returns: | |
PILImage: The modified image with the background color applied. | |
""" | |
colored_image = self.read_image(filepath) | |
colored_image = self.resize_image(colored_image,width=w,height=h) | |
colored_image = colored_image.convert("RGBA") | |
colored_image.paste(img, mask=img) | |
return colored_image | |
def process_video(self,frame,background_path): | |
""" | |
Remove background to the image and replace with a selective background. | |
Args: | |
img_path: The first image path. | |
background_path: The background image path. | |
output_path :The directory where the file wile be saved. (optional) | |
save: Whether to save the file or not. (optional) | |
Returns: | |
PILImage: background removed image. | |
""" | |
lst_imgs=[] | |
input = Image.fromarray(frame) | |
width, height=input.size | |
input=ImageOps.exif_transpose(input) | |
masks = self.session.predict(input) | |
for mask in masks: | |
cutout = self.putalpha_cutout(input, mask) | |
lst_imgs.append(cutout) | |
cutout=input | |
if len(lst_imgs) > 0: | |
cutout = self.get_concat_v_multi(lst_imgs) | |
result = self.apply_background(input , background_path , width , height) | |
result = np.array(result) | |
return result | |
def process(self,img_path,background_path,output_path="",save=False): | |
""" | |
Remove background to the image and replace with a selective background. | |
Args: | |
img_path: The first image path. | |
background_path: The background image path. | |
output_path :The directory where the file wile be saved. (optional) | |
save: Whether to save the file or not. (optional) | |
Returns: | |
PILImage: background removed image. | |
""" | |
lst_imgs=[] | |
input = self.read_image(img_path) | |
width, height=input.size | |
input=ImageOps.exif_transpose(input) | |
masks = self.session.predict(input) | |
for mask in masks: | |
cutout = self.putalpha_cutout(input, mask) | |
lst_imgs.append(cutout) | |
cutout=input | |
if len(lst_imgs) > 0: | |
cutout = self.get_concat_v_multi(lst_imgs) | |
result = self.apply_background(input , background_path , width , height) | |
if save: | |
result.save(output_path) | |
return result | |