File size: 2,670 Bytes
9e77087
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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()