HD-Painter / lib /utils /__init__.py
Andranik Sargsyan
add demo code
bfd34e9
raw
history blame contribute delete
No virus
2.77 kB
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