File size: 1,801 Bytes
026b6fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e1dcd59
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
# feifeilib/feifeifilter.py
import cv2
import numpy as np
from PIL import Image

def validate_image(img):
    """确保图像为3通道uint8格式"""
    if img.dtype != np.uint8:
        img = img.astype(np.uint8)
    if len(img.shape) == 2:
        img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
    elif img.shape[2] == 4:
        img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
    return img

def japanese_style(
    input_img, 
    brightness=15, 
    blue_intensity=1.1,
    softlight_strength=0.2
):
    """日系风格处理函数(已修复参数接收问题)"""
    # 参数类型转换(Gradio的Slider返回float类型)
    brightness = int(brightness)
    blue_intensity = float(blue_intensity)
    softlight_strength = float(softlight_strength)

    # 格式转换
    img = np.array(input_img)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
    img = validate_image(img)

    # ===== 基础调整 =====
    img = cv2.convertScaleAbs(img, alpha=1.1, beta=brightness)

    # ===== 色调调整 =====
    b, g, r = cv2.split(img)
    b = np.clip(b * blue_intensity, 0, 255).astype(np.uint8)
    g = np.clip(g * 1.05, 0, 255).astype(np.uint8)
    img = cv2.merge((b, g, r))

    # ===== 柔光效果 =====
    overlay = img.copy()
    cv2.rectangle(overlay, (0,0), (img.shape[1], img.shape[0]), 
                (210,230,250), -1)
    img = cv2.addWeighted(overlay, softlight_strength, 
                        img, 1-softlight_strength, 0)

    # ===== 曲线调整 =====
    lut = np.array([int(255 * (0.5 * np.sin((x/255 - 0.5)*np.pi) + 0.5)) 
                   for x in range(256)])
    img = cv2.LUT(img, lut)
    
    # 锐化前再次验证格式
    img = validate_image(img)
    
    # 转回PIL格式
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    return Image.fromarray(img)