2023-04-14 01:06:33 +00:00
|
|
|
from typing import Tuple, Union
|
|
|
|
|
|
|
|
from PIL import Image, ImageChops, ImageOps
|
|
|
|
|
|
|
|
from .mask_filter import mask_filter_none
|
|
|
|
from .noise_source import noise_source_histogram
|
2023-04-14 02:10:00 +00:00
|
|
|
from ..params import Border, Size
|
2023-04-14 01:06:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
# very loosely based on https://github.com/AUTOMATIC1111/stable-diffusion-webui/blob/master/scripts/outpainting_mk_2.py#L175-L232
|
|
|
|
def expand_image(
|
|
|
|
source: Image.Image,
|
|
|
|
mask: Image.Image,
|
|
|
|
expand: Border,
|
|
|
|
fill="white",
|
|
|
|
noise_source=noise_source_histogram,
|
|
|
|
mask_filter=mask_filter_none,
|
|
|
|
):
|
|
|
|
full_width = expand.left + source.width + expand.right
|
|
|
|
full_height = expand.top + source.height + expand.bottom
|
|
|
|
|
|
|
|
dims = (full_width, full_height)
|
|
|
|
origin = (expand.left, expand.top)
|
|
|
|
|
|
|
|
full_source = Image.new("RGB", dims, fill)
|
|
|
|
full_source.paste(source, origin)
|
|
|
|
|
|
|
|
# new mask pixels need to be filled with white so they will be replaced
|
|
|
|
full_mask = mask_filter(mask, dims, origin, fill="white")
|
|
|
|
full_noise = noise_source(source, dims, origin, fill=fill)
|
|
|
|
full_noise = ImageChops.multiply(full_noise, full_mask)
|
|
|
|
|
|
|
|
full_source = Image.composite(full_noise, full_source, full_mask.convert("L"))
|
|
|
|
|
|
|
|
return (full_source, full_mask, full_noise, (full_width, full_height))
|
|
|
|
|
|
|
|
|
|
|
|
def valid_image(
|
|
|
|
image: Image.Image,
|
|
|
|
min_dims: Union[Size, Tuple[int, int]] = [512, 512],
|
|
|
|
max_dims: Union[Size, Tuple[int, int]] = [512, 512],
|
|
|
|
) -> Image.Image:
|
|
|
|
min_x, min_y = min_dims
|
|
|
|
max_x, max_y = max_dims
|
|
|
|
|
|
|
|
if image.width > max_x or image.height > max_y:
|
|
|
|
image = ImageOps.contain(image, (max_x, max_y))
|
|
|
|
|
|
|
|
if image.width < min_x or image.height < min_y:
|
|
|
|
blank = Image.new(image.mode, (min_x, min_y), "black")
|
|
|
|
blank.paste(image)
|
|
|
|
image = blank
|
|
|
|
|
|
|
|
# check for square
|
|
|
|
|
|
|
|
return image
|
|
|
|
|
|
|
|
|
|
|
|
# from https://github.com/ForserX/StableDiffusionUI/blob/main/data/repo/diffusion_scripts/modules/controlnet/palette.py
|
|
|
|
# and others
|
|
|
|
def ade_palette():
|
|
|
|
"""ADE20K palette that maps each class to RGB values."""
|
|
|
|
return [
|
|
|
|
[120, 120, 120],
|
|
|
|
[180, 120, 120],
|
|
|
|
[6, 230, 230],
|
|
|
|
[80, 50, 50],
|
|
|
|
[4, 200, 3],
|
|
|
|
[120, 120, 80],
|
|
|
|
[140, 140, 140],
|
|
|
|
[204, 5, 255],
|
|
|
|
[230, 230, 230],
|
|
|
|
[4, 250, 7],
|
|
|
|
[224, 5, 255],
|
|
|
|
[235, 255, 7],
|
|
|
|
[150, 5, 61],
|
|
|
|
[120, 120, 70],
|
|
|
|
[8, 255, 51],
|
|
|
|
[255, 6, 82],
|
|
|
|
[143, 255, 140],
|
|
|
|
[204, 255, 4],
|
|
|
|
[255, 51, 7],
|
|
|
|
[204, 70, 3],
|
|
|
|
[0, 102, 200],
|
|
|
|
[61, 230, 250],
|
|
|
|
[255, 6, 51],
|
|
|
|
[11, 102, 255],
|
|
|
|
[255, 7, 71],
|
|
|
|
[255, 9, 224],
|
|
|
|
[9, 7, 230],
|
|
|
|
[220, 220, 220],
|
|
|
|
[255, 9, 92],
|
|
|
|
[112, 9, 255],
|
|
|
|
[8, 255, 214],
|
|
|
|
[7, 255, 224],
|
|
|
|
[255, 184, 6],
|
|
|
|
[10, 255, 71],
|
|
|
|
[255, 41, 10],
|
|
|
|
[7, 255, 255],
|
|
|
|
[224, 255, 8],
|
|
|
|
[102, 8, 255],
|
|
|
|
[255, 61, 6],
|
|
|
|
[255, 194, 7],
|
|
|
|
[255, 122, 8],
|
|
|
|
[0, 255, 20],
|
|
|
|
[255, 8, 41],
|
|
|
|
[255, 5, 153],
|
|
|
|
[6, 51, 255],
|
|
|
|
[235, 12, 255],
|
|
|
|
[160, 150, 20],
|
|
|
|
[0, 163, 255],
|
|
|
|
[140, 140, 140],
|
|
|
|
[250, 10, 15],
|
|
|
|
[20, 255, 0],
|
|
|
|
[31, 255, 0],
|
|
|
|
[255, 31, 0],
|
|
|
|
[255, 224, 0],
|
|
|
|
[153, 255, 0],
|
|
|
|
[0, 0, 255],
|
|
|
|
[255, 71, 0],
|
|
|
|
[0, 235, 255],
|
|
|
|
[0, 173, 255],
|
|
|
|
[31, 0, 255],
|
|
|
|
[11, 200, 200],
|
|
|
|
[255, 82, 0],
|
|
|
|
[0, 255, 245],
|
|
|
|
[0, 61, 255],
|
|
|
|
[0, 255, 112],
|
|
|
|
[0, 255, 133],
|
|
|
|
[255, 0, 0],
|
|
|
|
[255, 163, 0],
|
|
|
|
[255, 102, 0],
|
|
|
|
[194, 255, 0],
|
|
|
|
[0, 143, 255],
|
|
|
|
[51, 255, 0],
|
|
|
|
[0, 82, 255],
|
|
|
|
[0, 255, 41],
|
|
|
|
[0, 255, 173],
|
|
|
|
[10, 0, 255],
|
|
|
|
[173, 255, 0],
|
|
|
|
[0, 255, 153],
|
|
|
|
[255, 92, 0],
|
|
|
|
[255, 0, 255],
|
|
|
|
[255, 0, 245],
|
|
|
|
[255, 0, 102],
|
|
|
|
[255, 173, 0],
|
|
|
|
[255, 0, 20],
|
|
|
|
[255, 184, 184],
|
|
|
|
[0, 31, 255],
|
|
|
|
[0, 255, 61],
|
|
|
|
[0, 71, 255],
|
|
|
|
[255, 0, 204],
|
|
|
|
[0, 255, 194],
|
|
|
|
[0, 255, 82],
|
|
|
|
[0, 10, 255],
|
|
|
|
[0, 112, 255],
|
|
|
|
[51, 0, 255],
|
|
|
|
[0, 194, 255],
|
|
|
|
[0, 122, 255],
|
|
|
|
[0, 255, 163],
|
|
|
|
[255, 153, 0],
|
|
|
|
[0, 255, 10],
|
|
|
|
[255, 112, 0],
|
|
|
|
[143, 255, 0],
|
|
|
|
[82, 0, 255],
|
|
|
|
[163, 255, 0],
|
|
|
|
[255, 235, 0],
|
|
|
|
[8, 184, 170],
|
|
|
|
[133, 0, 255],
|
|
|
|
[0, 255, 92],
|
|
|
|
[184, 0, 255],
|
|
|
|
[255, 0, 31],
|
|
|
|
[0, 184, 255],
|
|
|
|
[0, 214, 255],
|
|
|
|
[255, 0, 112],
|
|
|
|
[92, 255, 0],
|
|
|
|
[0, 224, 255],
|
|
|
|
[112, 224, 255],
|
|
|
|
[70, 184, 160],
|
|
|
|
[163, 0, 255],
|
|
|
|
[153, 0, 255],
|
|
|
|
[71, 255, 0],
|
|
|
|
[255, 0, 163],
|
|
|
|
[255, 204, 0],
|
|
|
|
[255, 0, 143],
|
|
|
|
[0, 255, 235],
|
|
|
|
[133, 255, 0],
|
|
|
|
[255, 0, 235],
|
|
|
|
[245, 0, 255],
|
|
|
|
[255, 0, 122],
|
|
|
|
[255, 245, 0],
|
|
|
|
[10, 190, 212],
|
|
|
|
[214, 255, 0],
|
|
|
|
[0, 204, 255],
|
|
|
|
[20, 0, 255],
|
|
|
|
[255, 255, 0],
|
|
|
|
[0, 153, 255],
|
|
|
|
[0, 41, 255],
|
|
|
|
[0, 255, 204],
|
|
|
|
[41, 0, 255],
|
|
|
|
[41, 255, 0],
|
|
|
|
[173, 0, 255],
|
|
|
|
[0, 245, 255],
|
|
|
|
[71, 0, 255],
|
|
|
|
[122, 0, 255],
|
|
|
|
[0, 255, 184],
|
|
|
|
[0, 92, 255],
|
|
|
|
[184, 255, 0],
|
|
|
|
[0, 133, 255],
|
|
|
|
[255, 214, 0],
|
|
|
|
[25, 194, 194],
|
|
|
|
[102, 255, 0],
|
|
|
|
[92, 0, 255],
|
|
|
|
]
|