import cv2 import numpy as np import sys def convert_to_red_pseudo_color(input_path, output_path): cap = cv2.VideoCapture(input_path) if not cap.isOpened(): print("❌ 无法打开视频") return fps = cap.get(cv2.CAP_PROP_FPS) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter(output_path, fourcc, fps, (width, height)) # 基础色 #f21762 (BGR 顺序) #base_b, base_g, base_r = 98, 23, 242 # f80b5b base_b, base_g, base_r = 91, 11, 248 # f31347 #base_b, base_g, base_r = 71, 19, 243 ##b60430 #base_b, base_g, base_r = 48, 4, 182 # # 锐化核(锐度70) # sharpen_kernel = np.array([[-0.7, -0.7, -0.7], # [-0.7, 6.6, -0.7], # [-0.7, -0.7, -0.7]], dtype=np.float32) frame_count = 0 while True: ret, frame = cap.read() if not ret: break # 1. 灰度 + 明暗反转(亮变暗,暗变亮) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray_inverted = 255 - gray # 2. 归一化亮度 0~1 t = gray_inverted / 255.0 # 3. 关键:双向渐变 黑色 → #f21762 → 白色 # t < 0.5: 黑色到基础色的渐变 # t >= 0.5: 基础色到白色的渐变 pseudo = np.zeros_like(frame, dtype=np.float32) # 4. 亮度提升100% + 对比度70 pseudo = cv2.convertScaleAbs(pseudo, alpha=2.0, beta=1000) # 双向插值公式 mask_low = t < 0.5 # 暗区:黑 → 基础色 mask_high = t >= 0.5 # 亮区:基础色 → 白 # 暗区:从黑色(0)渐变到基础色 pseudo[mask_low, 0] = base_b * (t[mask_low] / 0.5) pseudo[mask_low, 1] = base_g * (t[mask_low] / 0.5) pseudo[mask_low, 2] = base_r * (t[mask_low] / 0.5) # 亮区:从基础色渐变到白色(255) t_high = (t[mask_high] - 0.5) / 0.5 # 重新映射到 0~1 pseudo[mask_high, 0] = base_b + t_high * (255 - base_b) pseudo[mask_high, 1] = base_g + t_high * (255 - base_g) pseudo[mask_high, 2] = base_r + t_high * (255 - base_r) pseudo = np.clip(pseudo, 0, 255).astype(np.uint8) # 5. 锐度70 # pseudo = cv2.filter2D(pseudo, -1, sharpen_kernel) out.write(pseudo) frame_count += 1 if frame_count % 100 == 0: print(f"处理进度: {frame_count}/{total_frames}") cap.release() out.release() print("🎉 完成 | #f80b5b 平滑双向渐变 + 反转 + 亮度/对比度/锐度") if __name__ == "__main__": if len(sys.argv) != 3: print("用法:python 脚本.py 输入.mp4 输出.mp4") else: convert_to_red_pseudo_color(sys.argv[1], sys.argv[2])