File size: 3,836 Bytes
6d0cee8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
01211ee
 
 
 
 
6d0cee8
 
 
 
904ddf6
6d0cee8
01211ee
6d0cee8
 
 
 
 
 
 
 
 
 
 
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import gradio as gr

from utils import *
from filters import *

builtin_funcs = {
    "Blur": blur,
    "Contour": contour,
    "Detail": detail,
    "Edge enhance": edge,
    "Edge enhance more": edgeMore,
    "Emboss": emboss,
    "Find edges": findEdges,
    "Sharpen": sharpen,
    "Smoot": smoot,
    "Smoot More": smootMore
}

radio_funcs = {
    "Gaussian Blur": gaussianBlur,
    "Box Blur": boxBlur
}

builtin_choices = keys(builtin_funcs)
radio_choices = keys(radio_funcs)


def convolution(image, kernel, size, scale, offset, iterations):
    if isinstance(kernel, str):
        size = split_numbers(size)
        kernel = split_numbers(kernel)
    result = image.filter(ImageFilter.Kernel(size, kernel, scale, offset))
    if iterations == 1:
        return result
    return convolution(result, kernel, size, scale, offset, iterations - 1)


def filters_builtin(image, func):
    return builtin_funcs[func](image)


def filters_radio(image, func, radio):
    return radio_funcs[func](image, radio)


def mirror(x):
    return x


footer = r"""
<center>
<b>
Demo based on <a href='https://github.com/leonelhs/pillow-gui'>Pillow Tool Utility</a>
</b>
</center>
"""

with gr.Blocks(title="Pillow Tool") as app:
    gr.HTML("<center><h1>Pillow Tool Utility</h1></center>")

    with gr.Row(equal_height=False):

        with gr.Column():
            input_img = gr.Image(type="pil", label="Input image")
            with gr.Accordion(label="Basic filters", open=True):
                drp_builtin = gr.Dropdown(choices=builtin_choices, label="Filter functions", value="Blur")
                gr.HTML("</br>")
                bti_btn = gr.Button(value="Filter")
            with gr.Accordion(label="Blur filters", open=False):
                rdi_builtin = gr.Dropdown(choices=radio_choices, label="Filter Blur", value="Gaussian Blur")
                blr_rad = gr.Slider(1, 100, step=1, value=1, label="Blur radius")
                gr.HTML("</br>")
                rad_btn = gr.Button(value="Blurry")
            with gr.Accordion(label="Unsharp filter", open=False):
                unsr_rad = gr.Slider(1, 100, step=1, value=1, label="Unshap mask radius")
                unsr_per = gr.Slider(1, 200, step=1, value=1, label="Unshap percent")
                unsr_tre = gr.Slider(1, 10, step=1, value=1, label="Unshap threshold")
                gr.HTML("</br>")
                srp_btn = gr.Button(value="Unsharp")
            with gr.Accordion(label="Convolution filter", open=False):
                ker_txt = gr.Textbox(label="Kernel", value="-1, -1, -1, -1, 9, -1, -1, -1, -1")
                siz_txt = gr.Textbox(label="Kernel Size", value="3,3")
                with gr.Row():
                    scl_txt = gr.Number(label="Scale", value=1)
                    ofs_txt = gr.Number(label="Offset", value=0)
                    itr_txt = gr.Number(label="Iterations", value=1, minimum=1, maximum=10)
                gr.HTML("</br>")
                ker_btn = gr.Button(value="Convolution")

        with gr.Column():
            output_img = gr.Image(type="pil", label="Output image", interactive=False)
            kpt_btn = gr.Button(value="Keep it", variant="primary")
            gr.ClearButton(components=[input_img, output_img])

        bti_btn.click(filters_builtin, [input_img, drp_builtin], [output_img])
        rad_btn.click(filters_radio, inputs=[input_img, rdi_builtin, blr_rad], outputs=[output_img])
        srp_btn.click(unsharpMask, inputs=[input_img, unsr_rad, unsr_per, unsr_tre], outputs=[output_img])
        ker_btn.click(convolution, [input_img, ker_txt, siz_txt, scl_txt, ofs_txt, itr_txt], [output_img])
        kpt_btn.click(mirror, inputs=[output_img], outputs=[input_img])

    with gr.Row():
        gr.HTML(footer)

app.launch(share=False, debug=True, enable_queue=True, show_error=True)