Spaces:
Build error
Build error
| import base64 | |
| from typing import Tuple, Union | |
| 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 | |
| def resize(image: Image, size: Union[int, Tuple[int, int]], resample=Image.BICUBIC): | |
| if isinstance(size, int): | |
| w, h = image.size | |
| aspect_ratio = w / h | |
| size = (min(size, int(size * aspect_ratio)), | |
| min(size, int(size / aspect_ratio))) | |
| return image.resize(size, resample=resample) | |