如何用Python将黑白视频按自定义色彩映射转换为RGB视频
自定义色彩映射实现黑白视频转蓝绿黄渐变RGB视频
实现步骤
1. 像素值归一化与偏离度计算
先将原灰度视频的像素值(0-255)转换到[-1,1]区间,纯黑对应-1,中性灰(127)对应0,纯白对应1;再通过取绝对值得到每个像素偏离灰色的程度,范围为[0,1]:
import cv2 import numpy as np def normalize_and_deviation(gray_frame): # 归一化到[-1, 1]区间 normalized = (gray_frame / 127.5) - 1 # 计算偏离灰色的程度(绝对值) deviation = np.abs(normalized) return deviation
2. 自定义蓝-绿-黄渐变映射
根据偏离度值生成对应RGB色彩:偏离度0(中性灰)对应纯蓝,偏离度1(纯黑/纯白)对应纯黄,中间值线性过渡。用numpy向量化运算保证处理效率:
def apply_color_map(deviation): # 将偏离度从[0,1]映射到[0,255]整数范围 dev_scaled = deviation * 255 # 分别计算RGB通道值 r = dev_scaled g = np.minimum(dev_scaled * 2, 255) b = 255 - dev_scaled # 按OpenCV的BGR通道顺序堆叠,转为uint8格式 rgb_frame = np.stack([b, g, r], axis=-1).astype(np.uint8) return rgb_frame
3. 视频处理主逻辑
读取输入黑白视频,逐帧处理后写入输出RGB视频:
def convert_video(input_path, output_path): # 打开输入视频 cap = cv2.VideoCapture(input_path) if not cap.isOpened(): raise ValueError("无法打开输入视频") # 获取视频基础参数 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)) # 初始化视频写入器,使用MP4编码器 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter(output_path, fourcc, fps, (width, height)) while cap.isOpened(): ret, frame = cap.read() if not ret: break # 彩色视频转为灰度图,灰度视频直接使用 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) if len(frame.shape) == 3 else frame # 计算偏离度并应用色彩映射 deviation = normalize_and_deviation(gray_frame) colored_frame = apply_color_map(deviation) # 写入输出帧 out.write(colored_frame) # 释放资源 cap.release() out.release() cv2.destroyAllWindows() # 调用示例 convert_video("input_gray.mp4", "output_colored.mp4")
关键说明
- 色彩映射逻辑:通过对R、G、B通道分别计算实现平滑渐变,无需分段判断,适合视频实时处理场景。
- OpenCV通道兼容:因OpenCV默认使用BGR格式存储图像,堆叠通道时按B、G、R顺序排列,最终输出视频可正常按RGB格式播放。
- 输入兼容性:支持灰度视频或彩色视频自动转灰度处理,无需额外预处理。
内容的提问来源于stack exchange,提问作者Chinmay Kane
相关产品推荐
相关产品推荐

