Spaces:
Running
on
Zero
Running
on
Zero
File size: 2,710 Bytes
16a8ae4 00c86c6 05d9ddd 00c86c6 0316e9d 0aa210d 16a8ae4 477dcb8 f77dc2b 2dd8a35 0aa210d 16a8ae4 0aa210d 2dd8a35 eb5d4ba 0d4b0ba 477dcb8 16a8ae4 0a3b739 f77dc2b 2dd8a35 0a3b739 477dcb8 2dd8a35 477dcb8 2dd8a35 f77dc2b 2dd8a35 f77dc2b 477dcb8 0a3b739 16a8ae4 53bb294 16a8ae4 d0a94a5 25db6c9 00c86c6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
from PIL import Image
import numpy as np
import cv2
from rembg import remove
def background_removal(input_image_path):
"""
指定された画像から背景を除去し、透明部分を白背景にブレンドして返す関数。
小さなドットや、指定のアルファ閾値以下の小さな半透明領域も無視してトリミングを行います。
Parameters:
- input_image_path: 背景除去する画像のパス
"""
try:
input_image = Image.open(input_image_path).convert("RGBA")
except IOError:
print(f"Error: Cannot open {input_image_path}")
return None
area_threshold=100 # 無視する小さい領域のピクセル数の閾値
alpha_threshold=200 # 無視する小さい領域のピクセル数の閾値
# 背景除去処理
result = remove(input_image)
# アルファチャンネル取得
alpha = result.split()[-1] # アルファチャンネルを取得
bbox = alpha.getbbox()
if bbox:
# bbox 内の非透過ピクセルをカウント (alpha_threshold より大きいピクセルのみ)
cropped_alpha = alpha.crop(bbox)
non_transparent_pixel_count = sum(1 for pixel in cropped_alpha.getdata() if pixel >= alpha_threshold)
# 指定した閾値以上の領域がある場合のみトリミング
if non_transparent_pixel_count >= area_threshold:
result = result.crop(bbox)
else:
print("Small or semi-transparent region ignored")
# 結果を一時ファイルに保存
result_path = "tmp.png"
result.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 |