LineArt-Removar / app.py
tori29umai's picture
Add application file
ee14fdf
raw
history blame
3.06 kB
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)
# 主要な色を取得する関数
def get_major_colors(image, threshold_percentage=0.01):
if image.mode != 'RGB':
image = image.convert('RGB')
color_count = defaultdict(int)
for pixel in image.getdata():
color_count[pixel] += 1
total_pixels = image.width * image.height
major_colors = [(color, count) for color, count in color_count.items() if (count / total_pixels) >= threshold_percentage]
return major_colors
# 色を統合する関数
def consolidate_colors(major_colors, threshold):
colors_lab = [rgb2lab(np.array([[color]], dtype=np.float32)/255.0).reshape(3) for color, _ in major_colors]
i = 0
while i < len(colors_lab):
j = i + 1
while j < len(colors_lab):
if deltaE_ciede2000(colors_lab[i], colors_lab[j]) < threshold:
if major_colors[i][1] >= major_colors[j][1]:
major_colors[i] = (major_colors[i][0], major_colors[i][1] + major_colors[j][1])
major_colors.pop(j)
colors_lab.pop(j)
else:
major_colors[j] = (major_colors[j][0], major_colors[j][1] + major_colors[i][1])
major_colors.pop(i)
colors_lab.pop(i)
continue
j += 1
i += 1
return major_colors
# 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.inputs.Image(type='pil', label="Original Image"),
outputs=gr.outputs.Image(type='pil', label="Processed Image"),
title="Line Art Removal",
description="画像をアップロードして線画を除去します。"
)
iface.launch()