import gradio as gr import cv2 import numpy as np from skimage import segmentation, color # 功能實現 def apply_effects(image, edge_enabled, edge_threshold1, edge_threshold2, seg_enabled, seg_compactness, seg_n_segments, inpaint_enabled, inpaint_threshold): # 檢查是否有任何功能啟用 if not (edge_enabled or seg_enabled or inpaint_enabled): return image # 如果沒有功能啟用,回傳原圖 # 初始化處理結果為空 output = None # 邊緣檢測 (Edge Detection) if edge_enabled: gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, edge_threshold1, edge_threshold2) edges_colored = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR) output = edges_colored if output is None else cv2.addWeighted(output, 0.8, edges_colored, 0.2, 0) # 圖片分割 (Segmentation) if seg_enabled: labels = segmentation.slic(image, compactness=seg_compactness, n_segments=seg_n_segments, start_label=1) segmented_image = color.label2rgb(labels, image, kind='avg') segmented_image = (segmented_image * 255).astype(np.uint8) output = segmented_image if output is None else cv2.addWeighted(output, 0.7, segmented_image, 0.3, 0) # 圖片修復 (Inpainting) if inpaint_enabled: gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, mask = cv2.threshold(gray, inpaint_threshold, 255, cv2.THRESH_BINARY_INV) inpainted_image = cv2.inpaint(image if output is None else output, mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA) output = inpainted_image return output # Gradio Interface with gr.Blocks() as demo: gr.Markdown("# 疊加影像處理應用程式") gr.Markdown("上傳圖片並調整參數,依序疊加邊緣檢測、圖片分割與修復的效果。") # 輸入圖片 input_image = gr.Image(label="上傳圖片", type="numpy") # 邊緣檢測功能 edge_enabled = gr.Checkbox(label="啟用邊緣檢測", value=False) edge_threshold1 = gr.Slider(0, 255, value=100, label="邊緣檢測 - 門檻1", interactive=True) edge_threshold2 = gr.Slider(0, 255, value=200, label="邊緣檢測 - 門檻2", interactive=True) # 圖片分割功能 seg_enabled = gr.Checkbox(label="啟用圖片分割", value=False) seg_compactness = gr.Slider(1, 100, value=10, label="圖片分割 - 緊密度", interactive=True) seg_n_segments = gr.Slider(10, 500, value=100, label="圖片分割 - 區塊數量", interactive=True) # 圖片修復功能 inpaint_enabled = gr.Checkbox(label="啟用圖片修復", value=False) inpaint_threshold = gr.Slider(0, 255, value=127, label="圖片修復 - 遮罩門檻", interactive=True) # 輸出圖片 output_image = gr.Image(label="輸出圖片") # 按鈕執行 apply_button = gr.Button("應用效果") apply_button.click( apply_effects, inputs=[ input_image, edge_enabled, edge_threshold1, edge_threshold2, seg_enabled, seg_compactness, seg_n_segments, inpaint_enabled, inpaint_threshold ], outputs=output_image ) gr.Markdown("### 範例圖片(含參數設定)") # 定義範例 example_images = [ { "image": "1633448791825.jpg", "edge_enabled": True, "edge_threshold1": 50, "edge_threshold2": 150, "seg_enabled": False, "seg_compactness": 10, "seg_n_segments": 100, "inpaint_enabled": False, "inpaint_threshold": 127 }, { "image": "images.jfif", "edge_enabled": False, "edge_threshold1": 18, "edge_threshold2": 500, "seg_enabled": True, "seg_compactness": 18, "seg_n_segments": 500, "inpaint_enabled": False, "inpaint_threshold": 127 }, { "image": "下載.jfif", "edge_enabled": False, "edge_threshold1": 100, "edge_threshold2": 200, "seg_enabled": False, "seg_compactness": 10, "seg_n_segments": 100, "inpaint_enabled": True, "inpaint_threshold": 80 } ] for example in example_images: gr.Examples( examples=[[example["image"], example["edge_enabled"], example["edge_threshold1"], example["edge_threshold2"], example["seg_enabled"], example["seg_compactness"], example["seg_n_segments"], example["inpaint_enabled"], example["inpaint_threshold"]]], inputs=[input_image, edge_enabled, edge_threshold1, edge_threshold2, seg_enabled, seg_compactness, seg_n_segments, inpaint_enabled, inpaint_threshold] ) # 啟動應用程式 demo.launch()