SDXL-Shadow_Generation / shadow_utils.py
GeorgeQi's picture
Upload 3 files
d048c6f verified
import cv2
from PIL import Image
import numpy as np
def get_mask_bbox(mask_org, threshold=0):
'''
Returns the minimum bounding box of the mask. If the shadow area is all 0, a single-pixel image is symbolically returned.
'''
mask = mask_org.copy()
mask[mask > threshold] = 255
mask[mask <= threshold] = 0
h, w = mask.shape[:2]
if len(mask.shape) == 3:
coords = np.where(np.mean(mask, axis=-1, keepdims=False) > threshold)
else:
coords = np.where(mask > 20)
if len(coords[0]) > 0:
ymin, ymax = coords[0].min(), coords[0].max()
else:
ymin, ymax = h // 2, h // 2 + 1
if len(coords[1]) > 0:
xmin, xmax = coords[1].min(), coords[1].max()
else:
xmin, xmax = w // 2, w // 2 + 1
return (xmin, xmax, ymin, ymax)
def padding_image(img, padding_rate, canve_reso=1024, padding_color=(0, 0, 0)):
'''
img:PIL.Image
Scale the image proportionally and place it on a white square canvas,
making sure the long side of the original image is filled with padding_rate on the edge of the canvas.
'''
long_size = int(canve_reso*(1-padding_rate))
img = np.array(img)
h, w = img.shape[:2]
if h > w:
new_h = long_size
new_w = int(w / h * long_size)
else:
new_w = long_size
new_h = int(h / w * long_size)
resized_img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_AREA)
padding_h = (canve_reso - new_h) // 2
padding_w = (canve_reso - new_w) // 2
padding_output = np.ones((canve_reso, canve_reso, resized_img.shape[-1])) * \
np.array(padding_color)[np.newaxis, np.newaxis, :]
padding_output[padding_h:padding_h + new_h, padding_w:padding_w + new_w, :] = resized_img
return Image.fromarray(padding_output.astype(np.uint8))