import gradio as gr import cv2 import numpy as np from skimage.segmentation import slic from skimage.color import label2rgb import os import glob def edge_detection(image, threshold1, threshold2): gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) edges = cv2.Canny(gray, threshold1, threshold2) return edges def image_segmentation(image, n_segments, compactness): segments = slic(image, n_segments=n_segments, compactness=compactness, start_label=1) segmented_image = label2rgb(segments, image, kind="avg") return (segmented_image * 255).astype(np.uint8) def apply_threshold(image, threshold_value): gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) _, binary_image = cv2.threshold(gray_image, threshold_value, 255, cv2.THRESH_BINARY) return binary_image def apply_blur(image, kernel_size): kernel_size = int(kernel_size) if kernel_size % 2 == 0: kernel_size += 1 blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0) return blurred_image def apply_sharpen(image, intensity): kernel = np.array([ [0, -intensity, 0], [-intensity, 1 + 4 * intensity, -intensity], [0, -intensity, 0] ]) sharpened_image = cv2.filter2D(image, -1, kernel) return sharpened_image EXAMPLES_DIR = "examples/" example_images = glob.glob(os.path.join(EXAMPLES_DIR, "*.png")) def select_image(img): return img with gr.Blocks(theme='NoCrypt/miku') as demo: gr.Markdown("## 電腦視覺應用") image_input = gr.Image(label="上傳圖片", type="numpy", height="500px") with gr.Row(): for image in example_images: img_component = gr.Image( value=image, interactive=False, type="numpy" ) img_component.select( select_image, inputs=img_component, outputs=image_input ) gr.Markdown("---") with gr.Tab("邊緣檢測"): edge_threshold1 = gr.Slider(0, 255, value=50, label="邊緣檢測閾值1") edge_threshold2 = gr.Slider(0, 255, value=150, label="邊緣檢測閾值2") edge_button = gr.Button("執行邊緣檢測") edge_output = gr.Image(label="邊緣檢測結果", type="numpy") edge_button.click( edge_detection, inputs=[image_input, edge_threshold1, edge_threshold2], outputs=edge_output ) with gr.Tab("影像分割"): n_segments = gr.Slider(100, 1000, value=200, step=50, label="分割區域數量") compactness = gr.Slider(1, 50, value=10, label="分割緊湊性") segment_button = gr.Button("執行影像分割") segment_output = gr.Image(label="影像分割結果", type="numpy") segment_button.click( image_segmentation, inputs=[image_input, n_segments, compactness], outputs=segment_output ) with gr.Tab("圖像二值化"): threshold_slider = gr.Slider(0, 255, value=128, step=1, label="二值化閾值") threshold_button = gr.Button("應用二值化") threshold_output = gr.Image(label="二值化结果", type="numpy") threshold_button.click( apply_threshold, inputs=[image_input, threshold_slider], outputs=threshold_output ) with gr.Tab("模糊"): blur_slider = gr.Slider(1, 21, value=5, step=2, label="模糊核大小") blur_button = gr.Button("應用模糊") blur_output = gr.Image(label="模糊结果", type="numpy") blur_button.click( apply_blur, inputs=[image_input, blur_slider], outputs=blur_output ) with gr.Tab("銳化"): sharpen_slider = gr.Slider(0.0, 2.0, value=1.0, step=0.1, label="銳化强度") sharpen_button = gr.Button("應用銳化") sharpen_output = gr.Image(label="銳化结果", type="numpy") sharpen_button.click( apply_sharpen, inputs=[image_input, sharpen_slider], outputs=sharpen_output ) demo.launch(debug=True)