HD-Painter / src /utils /__init__.py
AndranikSargsyan
add support for diffusers checkpoint loading
f1cc496
raw
history blame contribute delete
No virus
3.13 kB
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)