Spaces:
Running
on
Zero
Running
on
Zero
from PIL import Image, ImageChops | |
import numpy as np | |
import cv2 | |
from rembg import remove | |
def background_removal(input_image_path): | |
""" | |
指定された画像から背景を除去し、白以外の領域でトリミングした画像を返す関数 | |
""" | |
try: | |
input_image = Image.open(input_image_path).convert("RGB") | |
except IOError: | |
print(f"Error: Cannot open {input_image_path}") | |
return None | |
# 背景除去処理 (白背景のRGB画像として返される) | |
result_image = remove(input_image).convert("RGB") | |
# トリミング処理 | |
bg = Image.new("RGB", result_image.size, (255, 255, 255)) # 白背景 | |
diff = ImageChops.difference(result_image, bg) | |
bbox = diff.getbbox() # 白以外の部分を含む境界ボックスを取得 | |
if bbox: | |
cropped_image = result_image.crop(bbox) | |
else: | |
cropped_image = result_image # 全部が白の場合はそのまま返す | |
# 結果を保存 | |
result_path = "tmp.png" | |
cropped_image.save(result_path) | |
return result_path | |
def resize_image_aspect_ratio(image): | |
# 元の画像サイズを取得 | |
original_width, original_height = image.size | |
# アスペクト比を計算 | |
aspect_ratio = original_width / original_height | |
# 標準のアスペクト比サイズを定義 | |
sizes = { | |
1: (1024, 1024), # 正方形 | |
4/3: (1152, 896), # 横長画像 | |
3/2: (1216, 832), | |
16/9: (1344, 768), | |
21/9: (1568, 672), | |
3/1: (1728, 576), | |
1/4: (512, 2048), # 縦長画像 | |
1/3: (576, 1728), | |
9/16: (768, 1344), | |
2/3: (832, 1216), | |
3/4: (896, 1152) | |
} | |
# 最も近いアスペクト比を見つける | |
closest_aspect_ratio = min(sizes.keys(), key=lambda x: abs(x - aspect_ratio)) | |
target_width, target_height = sizes[closest_aspect_ratio] | |
# リサイズ処理 | |
resized_image = image.resize((target_width, target_height), Image.LANCZOS) | |
return resized_image | |
def base_generation(size, color): | |
canvas = Image.new("RGBA", size, color) | |
return canvas |