将相机Raw 16位numpy数组图像校正至参考白平衡红蓝分量
白平衡校正与暗帧减除方案
核心思路
Raw格式未去马赛克图像的白平衡校正本质是对拜耳阵列中的R、B通道分别应用增益系数,将当前白平衡参数下的增益匹配到参考白平衡参数的增益水平,之后再减除参考白平衡下拍摄的暗帧。
步骤详解及代码示例
假设你已知:
- 参考白平衡参数:
R_ref(0-100)、B_ref(0-100) - 当前图像的白平衡参数:
R_curr(0-100)、B_curr(0-100) - 图像的分辨率:
height、width - 相机的拜耳模式(以常见的RGGB为例,若为其他模式需调整索引)
1. 计算白平衡校正系数
通常相机的0-100白平衡参数与通道增益呈线性正相关,因此校正系数为参考增益与当前增益的比值:
import numpy as np # 计算校正系数 r_correction = R_ref / R_curr b_correction = B_ref / B_curr
注:若相机参数与增益为负相关(参数越小增益越高),则反转比值为
R_curr / R_ref、B_curr / B_ref,需根据相机实际特性调整。
2. 将一维Raw数组转为二维拜耳阵列
# 假设输入的当前图像是一维uint16数组 raw_1d = np.array(...) # 你的当前图像一维数组 raw_img = raw_1d.reshape((height, width)).astype(np.float32)
3. 应用白平衡校正(针对拜耳通道)
对R、B通道分别乘以校正系数,G通道保持不变,同时处理16位数值的溢出:
# RGGB模式的通道索引: # R: 偶数行、偶数列 # G: 偶数行奇数列 + 奇数行偶数列 # B: 奇数行、奇数列 raw_img[::2, ::2] *= r_correction # 校正R通道 raw_img[1::2, 1::2] *= b_correction # 校正B通道 # 饱和裁剪,确保数值在16位无符号整数范围内(0-65535) raw_img = np.clip(raw_img, 0, 65535) corrected_raw_img = raw_img.astype(np.uint16) # 转回一维数组(若需要保持原始格式) corrected_raw_1d = corrected_raw_img.flatten()
4. 暗帧减除
先对多张暗帧计算平均(消除噪声),再进行饱和减除(避免负数):
# 假设你有若干张暗帧的一维数组:dark_frames_1d = [dark1, dark2, ...] avg_dark_1d = np.mean(dark_frames_1d, axis=0).astype(np.int32) corrected_raw_int32 = corrected_raw_1d.astype(np.int32) # 饱和减除,确保结果非负 final_raw_1d = np.maximum(corrected_raw_int32 - avg_dark_1d, 0).astype(np.uint16)
关键注意事项
- 拜耳模式匹配:必须确认相机的拜耳阵列格式(如BGGR、GBRG、GRBG),否则通道索引错误会导致校正失效。
- 增益线性验证:若相机白平衡参数与增益非线性,需通过校准获取参数-增益映射表,替换线性计算的校正系数。
- 参数一致性:暗帧必须与目标图像的曝光时间、ISO、温度等参数完全一致,否则暗帧减除效果会大打折扣。
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

