CoolFace
Apppublic

leonelhs/pillow

sourceHugging Facemitupdated 1y agoView on Hugging Face
1likes
app.py106 linesDownload Raw Back to root
1import gradio as gr2 3from utils import *4from filters import *5 6builtin_funcs = {7    "Blur": blur,8    "Contour": contour,9    "Detail": detail,10    "Edge enhance": edge,11    "Edge enhance more": edgeMore,12    "Emboss": emboss,13    "Find edges": findEdges,14    "Sharpen": sharpen,15    "Smoot": smoot,16    "Smoot More": smootMore17}18 19radio_funcs = {20    "Gaussian Blur": gaussianBlur,21    "Box Blur": boxBlur22}23 24builtin_choices = keys(builtin_funcs)25radio_choices = keys(radio_funcs)26 27 28def convolution(image, kernel, size, scale, offset, iterations):29    if isinstance(kernel, str):30        size = split_numbers(size)31        kernel = split_numbers(kernel)32    result = image.filter(ImageFilter.Kernel(size, kernel, scale, offset))33    if iterations == 1:34        return result35    return convolution(result, kernel, size, scale, offset, iterations - 1)36 37 38def filters_builtin(image, func):39    return builtin_funcs[func](image)40 41 42def filters_radio(image, func, radio):43    return radio_funcs[func](image, radio)44 45 46def mirror(x):47    return x48 49 50footer = r"""51<center>52<b>53Demo based on <a href='https://github.com/leonelhs/pillow-gui'>Pillow Tool Utility</a>54</b>55</center>56"""57 58with gr.Blocks(title="Pillow Tool") as app:59    gr.HTML("<center><h1>Pillow Tool Utility</h1></center>")60 61    with gr.Row(equal_height=False):62 63        with gr.Column():64            input_img = gr.Image(type="pil", label="Input image")65            with gr.Accordion(label="Basic filters", open=True):66                drp_builtin = gr.Dropdown(choices=builtin_choices, label="Filter functions", value="Blur")67                gr.HTML("</br>")68                bti_btn = gr.Button(value="Filter")69            with gr.Accordion(label="Blur filters", open=False):70                rdi_builtin = gr.Dropdown(choices=radio_choices, label="Filter Blur", value="Gaussian Blur")71                blr_rad = gr.Slider(1, 100, step=1, value=1, label="Blur radius")72                gr.HTML("</br>")73                rad_btn = gr.Button(value="Blurry")74            with gr.Accordion(label="Unsharp filter", open=False):75                unsr_rad = gr.Slider(1, 100, step=1, value=1, label="Unshap mask radius")76                unsr_per = gr.Slider(1, 200, step=1, value=1, label="Unshap percent")77                unsr_tre = gr.Slider(1, 10, step=1, value=1, label="Unshap threshold")78                gr.HTML("</br>")79                srp_btn = gr.Button(value="Unsharp")80            with gr.Accordion(label="Convolution filter", open=False):81                ker_txt = gr.Textbox(label="Kernel", value="-1, -1, -1, -1, 9, -1, -1, -1, -1")82                siz_txt = gr.Textbox(label="Kernel Size", value="3,3")83                with gr.Row():84                    scl_txt = gr.Number(label="Scale", value=1)85                    ofs_txt = gr.Number(label="Offset", value=0)86                    itr_txt = gr.Number(label="Iterations", value=1, minimum=1, maximum=10)87                gr.HTML("</br>")88                ker_btn = gr.Button(value="Convolution")89 90        with gr.Column():91            output_img = gr.Image(type="pil", label="Output image", interactive=False)92            kpt_btn = gr.Button(value="Keep it", variant="primary")93            gr.ClearButton(components=[input_img, output_img])94 95        bti_btn.click(filters_builtin, [input_img, drp_builtin], [output_img])96        rad_btn.click(filters_radio, inputs=[input_img, rdi_builtin, blr_rad], outputs=[output_img])97        srp_btn.click(unsharpMask, inputs=[input_img, unsr_rad, unsr_per, unsr_tre], outputs=[output_img])98        ker_btn.click(convolution, [input_img, ker_txt, siz_txt, scl_txt, ofs_txt, itr_txt], [output_img])99        kpt_btn.click(mirror, inputs=[output_img], outputs=[input_img])100 101    with gr.Row():102        gr.HTML(footer)103 104app.launch(share=False, debug=True, show_error=True, mcp_server=True)105app.queue()106