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()