import gradio as gr from PIL import Image, ImageFilter, ImageOps import cv2 import numpy as np import os from collections import defaultdict from skimage.color import deltaE_ciede2000, rgb2lab # XDoGフィルターを適用する関数 def XDoG_filter(image, kernel_size=0, sigma=1.4, k_sigma=1.6, epsilon=0, phi=10, gamma=0.98): epsilon /= 255 g1 = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma) g2 = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma * k_sigma) dog = g1 - gamma * g2 dog /= dog.max() e = 1 + np.tanh(phi * (dog - epsilon)) e[e >= 1] = 1 return (e * 255).astype('uint8') # 画像を二値化する関数 def binarize_image(image): _, binarized = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) return binarized # XDoGフィルターを画像に適用し、その後二値化する関数 def process_XDoG(image_path): image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) xdog_image = XDoG_filter(image) binarized_image = binarize_image(xdog_image) return Image.fromarray(binarized_image) # Gradioインターフェース用のメイン関数 def gradio_interface(image): image_path = 'temp_input_image.jpg' image.save(image_path) lineart = process_XDoG(image_path).convert('L') processed_image = ImageOps.invert(lineart) return processed_image # Gradioアプリを設定し、起動する iface = gr.Interface( fn=gradio_interface, inputs=gr.Image(type='pil', label="Original Image"), outputs=gr.Image(type='pil', label="Processed Image"), title="Line Art Removal", description="画像をアップロードして線画を除去します。" ) iface.launch()