Python实现RGB转Bayer格式 面向CARLA平台HIL仿真场景需求
RGB转Bayer格式实现方案(适配CARLA HIL仿真场景)
核心逻辑说明
RGB转Bayer本质是按照指定Bayer阵列排列规则对RGB三通道做下采样,每个像素位置仅保留对应色彩通道的数值,最终输出单通道的raw数组,体积为原RGB图的1/3,适配网络传输需求。
转换前需先确认服务端解包库支持的Bayer阵列模式,常用模式共4种:RGGB、BGGR、GBRG、GRBG,模式不匹配会导致解包后色彩完全错误。
方案1:轻量化Numpy原生实现(推荐)
无额外依赖,直接适配CARLA输出的三维RGB数组,性能损耗极低,适合仿真场景高帧率输出需求。
import numpy as np def rgb_to_bayer(rgb_img: np.ndarray, bayer_pattern: str = "RGGB") -> np.ndarray: """ 将RGB三维数组转换为指定模式的Bayer单通道数组 :param rgb_img: 输入RGB数组,格式为(Height, Width, 3),通道顺序为R-G-B :param bayer_pattern: 目标Bayer模式,支持RGGB/BGGR/GBRG/GRBG :return: 单通道Bayer raw数组,格式为(Height, Width) """ h, w = rgb_img.shape[:2] bayer = np.zeros((h, w), dtype=rgb_img.dtype) if bayer_pattern == "RGGB": bayer[0::2, 0::2] = rgb_img[0::2, 0::2, 0] # R通道 bayer[0::2, 1::2] = rgb_img[0::2, 1::2, 1] # G通道 bayer[1::2, 0::2] = rgb_img[1::2, 0::2, 1] # G通道 bayer[1::2, 1::2] = rgb_img[1::2, 1::2, 2] # B通道 elif bayer_pattern == "BGGR": bayer[0::2, 0::2] = rgb_img[0::2, 0::2, 2] # B通道 bayer[0::2, 1::2] = rgb_img[0::2, 1::2, 1] # G通道 bayer[1::2, 0::2] = rgb_img[1::2, 0::2, 1] # G通道 bayer[1::2, 1::2] = rgb_img[1::2, 1::2, 0] # R通道 elif bayer_pattern == "GBRG": bayer[0::2, 0::2] = rgb_img[0::2, 0::2, 1] # G通道 bayer[0::2, 1::2] = rgb_img[0::2, 1::2, 2] # B通道 bayer[1::2, 0::2] = rgb_img[1::2, 0::2, 0] # R通道 bayer[1::2, 1::2] = rgb_img[1::2, 1::2, 1] # G通道 elif bayer_pattern == "GRBG": bayer[0::2, 0::2] = rgb_img[0::2, 0::2, 1] # G通道 bayer[0::2, 1::2] = rgb_img[0::2, 1::2, 0] # R通道 bayer[1::2, 0::2] = rgb_img[1::2, 0::2, 2] # B通道 bayer[1::2, 1::2] = rgb_img[1::2, 1::2, 1] # G通道 else: raise ValueError(f"不支持的Bayer模式:{bayer_pattern},仅支持RGGB/BGGR/GBRG/GRBG") return bayer
方案2:高仿真度实现(适配HIL测试真实度要求)
如果需要模拟真实物理相机的sensor响应、黑电平、噪声等特性,可以使用colour-science库的专业接口:
- 先安装依赖:
pip install colour-science - 调用示例:
import colour from colour.models import bayer_pattern_RGGB, bayer_pattern_BGGR # 以RGGB模式为例,其他模式替换对应枚举值即可 bayer_raw = colour.cfa_rgb_to_bayer(rgb_img, pattern=bayer_pattern_RGGB)
正确性校验方法
可借助OpenCV的Bayer转RGB接口反向验证转换结果:
import cv2 # 假设你转换的是RGGB模式的Bayer数组 converted_bayer = rgb_to_bayer(carla_rgb_img, "RGGB") # 反向转换回RGB,注意OpenCV默认通道顺序为BGR,需要调整为RGB recovered_rgb = cv2.cvtColor(converted_bayer, cv2.COLOR_BayerRG2RGB) # 对比recovered_rgb和原始carla_rgb_img的误差,误差在合理范围内即说明转换正确
内容的提问来源于stack exchange,提问作者Dinesh Thirumurugan
相关产品推荐
相关产品推荐

