yiming-0120's picture
Create app.py
9e77087 verified
import gradio as gr
import cv2
import numpy as np
from PIL import Image
def apply_color_filter(input_image, filter_type):
# 將 Gradio 輸入的 numpy array 轉換為 Pillow 影像
pil_img = Image.fromarray(input_image.astype('uint8'), 'RGB')
# 轉換為 OpenCV 格式 (BGR)
cv_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
# 色彩轉換處理
if filter_type == "暖陽復古":
processed = cv2.cvtColor(cv_img, cv2.COLOR_BGR2HSV)
processed[:, :, 0] = 20 # 調整色相為暖黃色
processed[:, :, 1] = cv2.add(processed[:, :, 1], 50) # 增加飽和度
processed = cv2.cvtColor(processed, cv2.COLOR_HSV2BGR)
elif filter_type == "柔和藍調":
gray = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
processed = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
processed[:, :, 0] = cv2.add(processed[:, :, 0], 80) # 增加藍色調
elif filter_type == "淡雅粉霧":
processed = cv_img.copy()
processed[:, :, 1] = cv2.subtract(processed[:, :, 1], 50) # 減少綠色調
processed[:, :, 2] = cv2.add(processed[:, :, 2], 70) # 增加紅色調
elif filter_type == "黑白柔光":
gray = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
processed = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
alpha = 0.7
overlay = np.full_like(processed, (240, 240, 240)) # 柔光效果
processed = cv2.addWeighted(overlay, alpha, processed, 1 - alpha, 0)
elif filter_type == "清新綠野":
processed = cv2.cvtColor(cv_img, cv2.COLOR_BGR2HSV)
processed[:, :, 0] = 60 # 調整色相為綠色
processed[:, :, 1] = cv2.add(processed[:, :, 1], 40) # 增加飽和度
processed = cv2.cvtColor(processed, cv2.COLOR_HSV2BGR)
else:
processed = cv_img
# 返回處理後的 RGB 圖片供 Gradio 輸出
return cv2.cvtColor(processed, cv2.COLOR_BGR2RGB)
# Gradio 界面設計
with gr.Blocks() as demo:
gr.Markdown("## 🎨 圖片色彩魔法棒 - 人文風格")
with gr.Row():
with gr.Column():
input_image = gr.Image(label="上傳圖片")
filter_choice = gr.Dropdown(
choices=["暖陽復古", "柔和藍調", "淡雅粉霧", "黑白柔光", "清新綠野"],
label="選擇色調風格",
value="暖陽復古"
)
submit_btn = gr.Button("施展魔法!")
output_image = gr.Image(label="處理結果")
submit_btn.click(
fn=apply_color_filter,
inputs=[input_image, filter_choice],
outputs=output_image
)
if __name__ == "__main__":
demo.launch()