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