AaronWu901225's picture
Update app.py
ca85123 verified
raw
history blame
4.8 kB
import gradio as gr
from skimage import color
import cv2
import numpy as np
# 邊緣檢測函式
def edge_detection(image, threshold1, threshold2):
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
edges = cv2.Canny(gray_image, threshold1, threshold2)
return edges
# 圖像分割函式
def image_segmentation(image, compactness):
from skimage.segmentation import slic
segments = slic(image, compactness=compactness, n_segments=200)
return color.label2rgb(segments, image, kind='avg')
# 顏色範圍調整函式
def adjust_color(image, r_min, r_max, g_min, g_max, b_min, b_max):
if image.shape[-1] == 4: # 如果圖片有 alpha 通道
image = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB)
image = image.astype(np.float32)
image[:, :, 0] = np.clip(image[:, :, 0], r_min, r_max) # 調整 R 通道
image[:, :, 1] = np.clip(image[:, :, 1], g_min, g_max) # 調整 G 通道
image[:, :, 2] = np.clip(image[:, :, 2], b_min, b_max) # 調整 B 通道
image = image.astype(np.uint8)
return image
# 主應用程式
def app():
with gr.Blocks() as demo:
gr.Markdown("# 影像處理功能展示")
gr.Markdown("本應用程式展示了邊緣檢測、圖像分割和顏色範圍調整功能,每個功能附帶範例圖片和測試結果。")
# 邊緣檢測功能
with gr.Tab("邊緣檢測"):
with gr.Row():
input_image = gr.Image(label="輸入圖片", value="simple_plain_pikachu_by_titanplakinside_dexx027.png") # 範例圖片
edge_result = gr.Image(label="邊緣檢測結果")
with gr.Row():
threshold1 = gr.Slider(0, 255, value=100, step=1, label="閾值1")
threshold2 = gr.Slider(0, 255, value=200, step=1, label="閾值2")
edge_button = gr.Button("執行邊緣檢測")
edge_button.click(
fn=edge_detection,
inputs=[input_image, threshold1, threshold2],
outputs=edge_result
)
gr.Examples(
examples=["simple_plain_pikachu_by_titanplakinside_dexx027.png"],
inputs=[input_image],
outputs=[edge_result],
fn=lambda img: edge_detection(img, 100, 200),
label="測試範例"
)
# 圖像分割功能
with gr.Tab("圖像分割"):
with gr.Row():
input_image = gr.Image(label="輸入圖片", value="simple_plain_pikachu_by_titanplakinside_dexx027.png") # 範例圖片
seg_result = gr.Image(label="分割結果")
with gr.Row():
compactness = gr.Slider(0.1, 100, value=10, step=0.1, label="分割緊湊度")
seg_button = gr.Button("執行圖像分割")
seg_button.click(
fn=image_segmentation,
inputs=[input_image, compactness],
outputs=seg_result
)
gr.Examples(
examples=["simple_plain_pikachu_by_titanplakinside_dexx027.png"],
inputs=[input_image],
outputs=[seg_result],
fn=lambda img: image_segmentation(img, 10),
label="測試範例"
)
# 顏色範圍調整功能
with gr.Tab("顏色範圍調整"):
with gr.Row():
input_image = gr.Image(label="輸入圖片", value="simple_plain_pikachu_by_titanplakinside_dexx027.png") # 範例圖片
adjusted_result = gr.Image(label="調整後的圖片")
with gr.Row():
r_min = gr.Slider(0, 255, value=50, step=1, label="R 最小值")
r_max = gr.Slider(0, 255, value=200, step=1, label="R 最大值")
g_min = gr.Slider(0, 255, value=50, step=1, label="G 最小值")
g_max = gr.Slider(0, 255, value=200, step=1, label="G 最大值")
b_min = gr.Slider(0, 255, value=50, step=1, label="B 最小值")
b_max = gr.Slider(0, 255, value=200, step=1, label="B 最大值")
adjust_button = gr.Button("調整顏色範圍")
adjust_button.click(
fn=adjust_color,
inputs=[input_image, r_min, r_max, g_min, g_max, b_min, b_max],
outputs=adjusted_result
)
gr.Examples(
examples=["simple_plain_pikachu_by_titanplakinside_dexx027.png"],
inputs=[input_image],
outputs=[adjusted_result],
fn=lambda img: adjust_color(img, 50, 200, 50, 200, 50, 200),
label="測試範例"
)
return demo
# 啟動應用程式
if __name__ == "__main__":
app().launch()