magic-eraser / app.py
UcfZem's picture
Add FastAPI /api/erase endpoint with CORS
ae96d2e
Raw
History Blame Contribute Delete
1.8 kB
import gradio as gr
import cv2
import numpy as np
from PIL import Image
import io, base64, json
from fastapi import FastAPI, Request
from fastapi.responses import Response
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
@app.post("/api/erase")
async def api_erase(request: Request):
body = await request.json()
img = Image.open(io.BytesIO(base64.b64decode(body['image'])))
msk = Image.open(io.BytesIO(base64.b64decode(body['mask'])))
img_np = np.array(img.convert('RGB'))
msk_np = np.array(msk.convert('L'))
_, msk_np = cv2.threshold(msk_np, 127, 255, cv2.THRESH_BINARY)
result = cv2.inpaint(img_np, msk_np, 3, cv2.INPAINT_TELEA)
buf = io.BytesIO()
Image.fromarray(result).save(buf, 'PNG')
return Response(content=buf.getvalue(), media_type='image/png')
def inpaint_ui(image, mask):
img = np.array(image.convert('RGB'))
msk = np.array(mask.convert('L'))
_, msk = cv2.threshold(msk, 127, 255, cv2.THRESH_BINARY)
result = cv2.inpaint(img, msk, 3, cv2.INPAINT_TELEA)
return Image.fromarray(result)
css = 'footer{display:none}'
with gr.Blocks(title='Magic Eraser', css=css) as demo:
gr.Markdown('# ✨ Magic Eraser')
with gr.Row():
with gr.Column():
image = gr.Image(label='Photo', type='pil')
mask = gr.Image(label='Mask (white = area to remove)', type='pil')
btn = gr.Button('✨ Erase Object')
with gr.Column():
result = gr.Image(label='Result', type='pil')
btn.click(fn=inpaint_ui, inputs=[image, mask], outputs=[result])
gr.Markdown('Draw the area to remove in **white** on the mask image.')
gr.mount_gradio_app(app, demo, path="/")