Albert-Linn's picture
Update app.py
689a4fa verified
import gradio as gr
import cv2
from skimage import segmentation, color
import numpy as np
# 功能 1: 影像分割
def segment_image(image, n_segments, compactness):
segments = segmentation.slic(image, n_segments=n_segments, compactness=compactness)
segmented_image = color.label2rgb(segments, image, kind='avg')
return (segmented_image * 255).astype(np.uint8)
# 功能 2: 邊緣檢測
def edge_detection(image, threshold1, threshold2):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, threshold1, threshold2)
return edges
# 功能 3: 遮罩生成
def generate_mask(image, threshold1, threshold2):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, threshold1, threshold2)
mask = cv2.dilate(edges, None, iterations=2)
mask = cv2.threshold(mask, 1, 255, cv2.THRESH_BINARY)[1]
return mask
# 功能 4: 影像修復
def inpaint_image(image, mask, method):
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
inpaint_method = cv2.INPAINT_TELEA if method == "Telea" else cv2.INPAINT_NS
inpainted = cv2.inpaint(image, mask, 3, inpaint_method)
return inpainted
# Gradio 界面設計
with gr.Blocks() as app:
gr.Markdown("# 🌟 影像處理工具")
gr.Markdown("使用本工具進行多種影像處理,如影像分割、邊緣檢測、遮罩生成及影像修復。")
# 圖片輸入與範例圖片
with gr.Row():
gr.Markdown("### 範例圖片")
gr.Examples(
examples=[
["example1.jpg"],
["example2.jpg"],
["example3.jpg"],
["image (2).webp"],
["image (3).webp"],
["image (4).webp"]
],
inputs=[gr.Image(type="numpy", label="上傳圖片")],
outputs=None,
label="選擇範例圖片"
)
# 各功能分區
with gr.Tab("影像分割"):
gr.Markdown("### 影像分割")
input_image = gr.Image(type="numpy", label="上傳圖片")
n_segments = gr.Slider(10, 500, value=100, label="分割區域數量")
compactness = gr.Slider(0.1, 10.0, value=1.0, label="緊湊性")
segmented_output = gr.Image(label="分割結果")
gr.Button("執行").click(segment_image, inputs=[input_image, n_segments, compactness], outputs=segmented_output)
with gr.Tab("邊緣檢測"):
gr.Markdown("### 邊緣檢測")
input_image = gr.Image(type="numpy", label="上傳圖片")
threshold1 = gr.Slider(0, 255, value=50, label="閾值1")
threshold2 = gr.Slider(0, 255, value=150, label="閾值2")
edge_output = gr.Image(label="邊緣檢測結果")
gr.Button("執行").click(edge_detection, inputs=[input_image, threshold1, threshold2], outputs=edge_output)
with gr.Tab("遮罩生成"):
gr.Markdown("### 遮罩生成")
input_image = gr.Image(type="numpy", label="上傳圖片")
threshold1 = gr.Slider(0, 255, value=50, label="邊緣檢測閾值1")
threshold2 = gr.Slider(0, 255, value=150, label="邊緣檢測閾值2")
generated_mask = gr.Image(label="生成的遮罩")
gr.Button("生成遮罩").click(generate_mask, inputs=[input_image, threshold1, threshold2], outputs=generated_mask)
with gr.Tab("影像修復"):
gr.Markdown("### 影像修復")
input_image = gr.Image(type="numpy", label="上傳圖片")
input_mask = gr.Image(type="numpy", label="選擇遮罩(生成或手動上傳)")
method = gr.Radio(["Telea", "Navier-Stokes"], value="Telea", label="修復演算法")
inpainted_output = gr.Image(label="修復結果")
gr.Button("執行修復").click(inpaint_image, inputs=[input_image, input_mask, method], outputs=inpainted_output)
app.launch()