Spaces:
Runtime error
Runtime error
File size: 3,064 Bytes
3ea2029 ee14fdf 3ea2029 ee14fdf 3ea2029 ee14fdf |
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 81 82 |
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()
|