File size: 4,190 Bytes
2b08643 c738949 2881cb5 c738949 2b08643 2881cb5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
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)
|