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()