Spaces:
Build error
Build error
| 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() | |