Spaces:
Running
on
A10G
Running
on
A10G
import base64 | |
import cv2 | |
import numpy as np | |
import open_clip | |
from PIL import Image | |
from tqdm import tqdm | |
from .iimage import IImage | |
def tokenize(prompt): | |
tokens = open_clip.tokenize(prompt)[0] | |
return [open_clip.tokenizer._tokenizer.decoder[x.item()] for x in tokens] | |
def poisson_blend( | |
orig_img: np.ndarray, | |
fake_img: np.ndarray, | |
mask: np.ndarray, | |
pad_width: int = 32, | |
dilation: int = 48 | |
) -> np.ndarray: | |
"""Does poisson blending with some tricks. | |
Args: | |
orig_img (np.ndarray): Original image. | |
fake_img (np.ndarray): Generated fake image to blend. | |
mask (np.ndarray): Binary 0-1 mask to use for blending. | |
pad_width (np.ndarray): Amount of padding to add before blending (useful to avoid some issues). | |
dilation (np.ndarray): Amount of dilation to add to the mask before blending (useful to avoid some issues). | |
Returns: | |
np.ndarray: Blended image. | |
""" | |
mask = mask[:, :, 0] | |
padding_config = ((pad_width, pad_width), (pad_width, pad_width), (0, 0)) | |
padded_fake_img = np.pad(fake_img, pad_width=padding_config, mode="reflect") | |
padded_orig_img = np.pad(orig_img, pad_width=padding_config, mode="reflect") | |
padded_orig_img[:pad_width, :, :] = padded_fake_img[:pad_width, :, :] | |
padded_orig_img[:, :pad_width, :] = padded_fake_img[:, :pad_width, :] | |
padded_orig_img[-pad_width:, :, :] = padded_fake_img[-pad_width:, :, :] | |
padded_orig_img[:, -pad_width:, :] = padded_fake_img[:, -pad_width:, :] | |
padded_mask = np.pad(mask, pad_width=padding_config[:2], mode="constant") | |
padded_dmask = cv2.dilate(padded_mask, np.ones((dilation, dilation), np.uint8), iterations=1) | |
x_min, y_min, rect_w, rect_h = cv2.boundingRect(padded_dmask) | |
center = (x_min + rect_w // 2, y_min + rect_h // 2) | |
output = cv2.seamlessClone(padded_fake_img, padded_orig_img, padded_dmask, center, cv2.NORMAL_CLONE) | |
output = output[pad_width:-pad_width, pad_width:-pad_width] | |
return output | |
def image_from_url_text(filedata): | |
if filedata is None: | |
return None | |
if type(filedata) == list and filedata and type(filedata[0]) == dict and filedata[0].get("is_file", False): | |
filedata = filedata[0] | |
if type(filedata) == dict and filedata.get("is_file", False): | |
filename = filedata["name"] | |
filename = filename.rsplit('?', 1)[0] | |
return Image.open(filename) | |
if type(filedata) == list: | |
if len(filedata) == 0: | |
return None | |
filedata = filedata[0] | |
if filedata.startswith("data:image/png;base64,"): | |
filedata = filedata[len("data:image/png;base64,"):] | |
filedata = base64.decodebytes(filedata.encode('utf-8')) | |
image = Image.open(io.BytesIO(filedata)) | |
return image | |