Spaces:
Running
on
Zero
Running
on
Zero
File size: 2,527 Bytes
16a8ae4 00c86c6 05d9ddd 00c86c6 0aa210d 16a8ae4 f77dc2b 2dd8a35 0aa210d 16a8ae4 0aa210d 2dd8a35 16a8ae4 0a3b739 f77dc2b 2dd8a35 0a3b739 f77dc2b 2dd8a35 f77dc2b 2dd8a35 f77dc2b 2dd8a35 f77dc2b 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 |
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 # 無視する小さい領域のピクセル数の閾値
# 背景除去処理
result = remove(input_image)
# アルファチャンネル取得
alpha = result.split()[-1] # アルファチャンネルを取得
bbox = alpha.getbbox()
if bbox:
# bbox 内の完全透過でないピクセルをカウント
cropped_alpha = alpha.crop(bbox)
non_transparent_pixel_count = sum(1 for pixel in cropped_alpha.getdata() if pixel > 0)
# 指定した閾値以上の領域がある場合のみトリミング
if non_transparent_pixel_count >= area_threshold:
result = result.crop(bbox)
else:
print("Small 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 |