Spaces:
Sleeping
Sleeping
| # DanBooru IMage Utility functions | |
| # Taken from https://huggingface.co/spaces/SmilingWolf/wd-v1-4-tags | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image | |
| import PIL | |
| def smart_imread(img, flag=cv2.IMREAD_UNCHANGED): | |
| if img.endswith(".gif"): | |
| img = Image.open(img) | |
| img = img.convert("RGB") | |
| img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) | |
| else: | |
| img = cv2.imread(img, flag) | |
| return img | |
| def smart_24bit(img): | |
| if img.dtype is np.dtype(np.uint16): | |
| img = (img / 257).astype(np.uint8) | |
| if len(img.shape) == 2: | |
| img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) | |
| elif img.shape[2] == 4: | |
| trans_mask = img[:, :, 3] == 0 | |
| img[trans_mask] = [255, 255, 255, 255] | |
| img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR) | |
| return img | |
| def make_square(img, target_size): | |
| old_size = img.shape[:2] | |
| desired_size = max(old_size) | |
| desired_size = max(desired_size, target_size) | |
| delta_w = desired_size - old_size[1] | |
| delta_h = desired_size - old_size[0] | |
| top, bottom = delta_h // 2, delta_h - (delta_h // 2) | |
| left, right = delta_w // 2, delta_w - (delta_w // 2) | |
| color = [255, 255, 255] | |
| new_im = cv2.copyMakeBorder( | |
| img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color | |
| ) | |
| return new_im | |
| def smart_resize(img, size): | |
| # Assumes the image has already gone through make_square | |
| if img.shape[0] > size: | |
| img = cv2.resize(img, (size, size), interpolation=cv2.INTER_AREA) | |
| elif img.shape[0] < size: | |
| img = cv2.resize(img, (size, size), interpolation=cv2.INTER_CUBIC) | |
| return img | |
| def preprocess_image(img): | |
| image = img.convert('RGBA') | |
| new_image = PIL.Image.new('RGBA', image.size, 'WHITE') | |
| new_image.paste(image, mask=image) | |
| image = new_image.convert('RGB') | |
| image = np.asarray(image) | |
| image = make_square(image, 512) | |
| image = smart_resize(image, 512) | |
| image = image.astype(np.float32) | |
| return Image.fromarray(np.uint8(image)) |