原始传感器数据(RAW)是整条ISP流水线中最接近物理成像过程的表示形式。它既保留了最多的信息,也携带了最多的器件非理想性:黑电平偏移、列/行固定模式噪声、温度相关暗电流、ADC非线性、像素响应不一致,以及不同增益档位下的响应漂移。如果这些问题在前端没有被妥善校正,后续的Lens Shading、坏点修复、去马赛克、降噪和色彩处理都会建立在错误的信号基准之上,导致误检、色偏、动态范围损失甚至系统级不稳定。
在自动驾驶和具身智能系统中,RAW校正的要求比消费摄影更严格。系统不仅关心“画面好不好看”,更关心同一物体在不同温度、曝光、模拟增益和时间点下,是否仍然产生一致、可预测的数字响应。换言之,前端原始数据校正的目标不是简单“美化图像”,而是把传感器输出尽量还原为一个稳定、线性、可标定、可建模的信号域。
本章将系统介绍RAW前端校正链路的核心内容,包括Black Level Correction、固定模式噪声消除、暗电流补偿、线性化、PRNU校正,以及传感器增益与偏移标定。我们将同时讨论数学模型、标定方法、RTL/硬件实现结构,以及在车载与机器人场景中的工程权衡。
从系统设计角度,单个像素在ADC输出前后的信号可以抽象为:
\[D_{raw}(x,y) = Q\left(g_a \cdot \left[S(x,y) + I_{dark}(x,y,T)\cdot t_{exp} + O_{pix}(x,y) + O_{col}(y) + O_{row}(x)\right] + O_{adc}\right) + n_q\]其中:
这个模型说明:RAW数据并不等于“真实光照”,它是光信号、器件偏移、温漂和读出链路误差的叠加结果。ISP前端校正的本质,就是尽可能把这些非理想项从观测值中剥离出去。
工程上常见的RAW前端处理链路如下:
Sensor ADC Output
|
v
[Optical Black Statistics / Black Level]
|
v
[Dark Current Compensation]
|
v
[Row/Column FPN Correction]
|
v
[Linearization / Decompanding]
|
v
[PRNU / Flat-Field Correction]
|
v
[Gain & Offset Normalization]
|
v
To Lens Shading / Defect Pixel / Demosaic
这个顺序并非唯一,但有强烈的工程逻辑:
如果RAW校正不准,后续模块通常会出现连锁反应:
对自动驾驶系统而言,更严重的问题是同一场景在不同环境条件下产生不一致特征,进而影响感知网络的域稳定性。
理想情况下,在无光照、零信号输入时,传感器输出应为0。但真实系统不会这样工作,原因包括:
因此,RAW中的“0码值”通常不是物理意义上的黑,而是一个预留的数字基线。Black Level Correction(BLC)的目标,就是减去这个基线,使无光输入尽可能回到真实零点附近。
对Bayer传感器,黑电平通常按颜色平面独立建模:
\[B = \{B_R, B_{Gr}, B_{Gb}, B_B\}\]校正公式为:
\[P_{blc}(x,y,c) = \max\left(P_{raw}(x,y,c) - B_c,\ 0\right)\]这里的 $c \in {R, Gr, Gb, B}$,之所以区分两个绿色,是因为上下文中它们可能处于不同列/微透镜/读出路径,偏置并不完全相同。
许多传感器在有效成像区域边缘预留遮光像素(Optical Black, OB),这些像素理论上不受光照,只反映读出链路偏移和暗电流。ISP可以利用它们实时估计黑电平:
\[\hat{B}_c = \frac{1}{N_c} \sum_{(x,y)\in \Omega_{OB,c}} P_{raw}(x,y,c)\]其中 $\Omega_{OB,c}$ 是颜色平面 $c$ 对应的OB区域。
典型做法包括:
实时估计的优点是能跟踪温漂和电源漂移;缺点是若OB区域质量差,或强干扰耦合到OB像素,估计会不稳定。
工业产品中,黑电平通常不是“只靠实时估计”或“只靠工厂常数”,而是两者结合:
\[B_c(T,g_a,m) = B_{c,ref}(m) + \Delta B_{temp}(T,m) + \Delta B_{gain}(g_a,m)\]其中:
静态标定给出各模式下的参考黑电平,动态部分则依靠OB统计、温度表或时域跟踪更新。
时域平滑常用:
\[B_c^{(t)} = \alpha \cdot B_c^{(t-1)} + (1-\alpha)\cdot \hat{B}_c^{(t)}\]其中 $\alpha$ 一般取0.8到0.98。数值越大,噪声越小,但对快速漂移响应越慢。
黑电平减法虽然简单,却直接决定后续模块的信号基准,位宽设计不能随意。
若输入为12bit RAW,黑电平可能在64到256码值之间。常见实现策略:
12bit -> 16bitRTL结构通常很简单:
RAW In --> [Channel Select] --> [Subtract Bc] --> [Clamp] --> RAW_BLC
真正难点不在减法器,而在参数切换一致性:如果帧中途切换寄存器,可能出现前半帧用旧黑电平、后半帧用新黑电平的灾难性不连续,因此一般要使用影子寄存器和frame-sync生效机制。
车载系统常见以下特殊约束:
因此,BLC模块往往要输出统计信息给系统监控模块,而不仅仅输出校正后的像素。
固定模式噪声(Fixed Pattern Noise, FPN)是指在相同输入条件下、空间上稳定重复出现的噪声结构。它不同于随机噪声,后者会在时间上波动;FPN在多帧平均后反而更加明显。
常见FPN可分为:
在工程实现里,Offset FPN通常在黑电平/暗电流附近处理,Gain FPN与PRNU有一定重叠,但标定手段和更新节奏不同。
假设某列存在稳定偏移 $\delta_{col}(y)$,则:
\[P(x,y) = S(x,y) + \delta_{col}(y) + n(x,y)\]校正公式为:
\[P_{cfpn}(x,y) = P(x,y) - \hat{\delta}_{col}(y)\]列偏移的估计方式主要有两类:
方法A:暗场标定
在暗场下拍摄多帧,计算每列均值:
\[\hat{\delta}_{col}(y) = \frac{1}{M \cdot H} \sum_{k=1}^{M}\sum_{x=1}^{H} P_k(x,y) - \bar{P}\]其中 $H$ 为图像高度,$\bar{P}$ 为全局均值,用于去除公共偏移。
方法B:在线高通估计
对于纹理不强的区域,可用列均值减全局均值近似列偏移,但需要屏蔽强边缘和高对比目标,否则真实内容会泄漏进校正量。
当行FPN和列FPN同时存在时,可以写成:
\[P(x,y) = S(x,y) + a_x + b_y + \epsilon(x,y)\]其中 $a_x$ 是行偏移,$b_y$ 是列偏移。这个模型本质上是一个低秩加性结构。标定时可用交替估计:
\[a_x = \frac{1}{W}\sum_{y} (P(x,y)-b_y), \qquad b_y = \frac{1}{H}\sum_{x}(P(x,y)-a_x)\]迭代2到3轮通常即可收敛。
对硬件来说,列FPN更容易实时处理,因为只需要一条“列参数表”;行FPN若用整行统计实时更新,容易引入额外行缓存压力,因此很多系统采用“工厂标定 + 慢更新”策略。
FPN去除看似简单,实际容易伤害真实图像结构。最常见错误是把大面积水平/垂直纹理当成行列偏置减掉。
例如在自动驾驶场景中:
因此,在线FPN估计通常需要:
RAW_BLC
|
v
[Address by Column/Row]
|
+--> [Column Offset LUT]
|
+--> [Row Offset LUT]
|
v
[Subtract / Combine]
|
v
RAW_FPN_Corrected
典型资源权衡:
暗电流是指在无光条件下,由热激发产生的电子流。其主要来源包括:
暗电流具有两个关键特征:
因此它与黑电平不同。黑电平更多是读出基线偏移,而暗电流是“会随时间积分增长”的电荷项。
最常用的一阶模型为:
\[D_{dark}(x,y,T,t_{exp}) = I_{dark}(x,y,T)\cdot t_{exp}\]若用参考温度 $T_0$ 表示,可近似写为:
\[I_{dark}(x,y,T) = I_{dark}(x,y,T_0)\cdot 2^{\frac{T-T_0}{\Delta T}}\]其中 $\Delta T$ 常取7到8°C,即温度每升高约7到8°C,暗电流翻倍。
完整补偿公式:
\[P_{dc}(x,y) = P_{in}(x,y) - \hat{I}_{dark}(x,y,T)\cdot t_{exp}\]如果仅用全局平均值替代逐像素模型,则:
\[P_{dc}(x,y) = P_{in}(x,y) - \hat{\mu}_{dark}(T,g_a,m)\cdot t_{exp}\]这会显著降低实现成本,但无法处理空间不均匀的热像素和暗电流热点。
暗电流补偿常见有两套工程路径。
路径A:暗帧模板
在工厂或系统维护阶段,采集不同温度、曝光、增益组合下的暗帧模板:
\[\mathcal{D}(x,y; T_i, t_j, g_k)\]运行时根据当前状态插值:
\[\hat{D}_{dark} = \text{Interp}\left(\mathcal{D}; T, t_{exp}, g_a\right)\]优点:
缺点:
路径B:温度-曝光分离模型
把暗电流分解为模板和比例项:
\[\hat{D}_{dark}(x,y) = D_{ref}(x,y) \cdot f_T(T) \cdot f_t(t_{exp}) \cdot f_g(g_a)\]优点是压缩参数量;缺点是当不同模式下空间分布形态都变了时,单一模板不足以覆盖。
暗电流补偿在以下场景尤其关键:
例如参考温度25°C时暗电流为10 e-/s,85°C时若每8°C翻倍,则:
\[I_{85} = 10 \cdot 2^{\frac{85-25}{8}} = 10 \cdot 2^{7.5} \approx 1810 \text{ e-/s}\]若曝光时间为20ms,则每像素平均暗信号约为:
\[Q_{dark} \approx 1810 \times 0.02 = 36.2 \text{ e-}\]这已经足以显著抬升暗部,并改变后续降噪和检测模块的噪声基线。
暗电流补偿和坏点修复不是同一件事,但二者高度相关。
工程上可采用分层策略:
这样可以避免把大量正常暗漂移都交给坏点模块处理,导致误检率上升。
常见硬件组织方式:
Temperature Sensor + Exposure Register + Gain Mode
|
v
[Dark Model Selector]
|
v
[Global / Tile / Pixel Template]
|
v
[Scale by t_exp]
|
v
[Subtract]
实现层级通常有三种:
许多传感器并不是把光子数线性映射到数字码值。非线性可能来自:
而ISP后续很多模块默认“输入近似线性”:
因此,线性化的目标是求出一个逆映射,使输出尽可能与入射光能量成正比。
设传感器理想响应为 $L$,实际测得数字输出为 $D = f(L)$,则线性化需要近似求逆:
\[L \approx f^{-1}(D)\]标定时一般在多组均匀照度下采样,得到一系列点 $(L_i, D_i)$,然后构建LUT或分段模型。
常见误差指标包括:
\[\epsilon_{lin} = \max_i \left| \frac{\hat{L}_i - L_i}{L_{FS}} \right|\]其中 $L_{FS}$ 表示满量程信号。对高质量RAW链路,线性化残差通常希望低于0.5%到1% FS。
最常见的是1D LUT:
\[P_{lin} = LUT(P_{in})\]若输入是12bit,则全精度LUT有4096项。为了节省面积,常用以下办法:
分段线性模型 \(P_{lin} = a_k \cdot P_{in} + b_k,\quad P_{in}\in [T_k,T_{k+1})\)
线性化LUT有两个容易被低估的工程问题。
问题1:插值误差
若相邻节点跨度过大,低码值区会出现响应误差,导致暗部统计不稳定。
问题2:单调性破坏
LUT若非严格单调,可能出现输入增大而输出不增的现象,严重影响排序、直方图和3A统计。
因此,LUT生成通常应满足:
\[LUT[i+1] \ge LUT[i]\]必要时可对标定数据做单调回归(monotonic regression)或后处理修正。
对于双转换增益(DCG)或多曝光HDR,线性化不仅是“修正非线性”,还承担“统一信号域”的任务。
例如高增益路径和低增益路径输出分别为:
\[D_H = f_H(L), \qquad D_L = f_L(L)\]经过线性化后:
\[L_H = f_H^{-1}(D_H), \qquad L_L = f_L^{-1}(D_L)\]只有在统一到相同线性域后,两条路径才能无偏融合。
这也是为什么某些系统把黑电平、线性化和模式归一化视为一个联合模块,而不是三个孤立模块。
线性化LUT通常位于高吞吐路径中,因此要特别注意:
典型结构:
RAW_FPN
|
v
[LUT Address Generator] --> [LUT SRAM]
| |
+--------> [Interpolator] <-+
|
v
RAW_Linear
PRNU(Photo Response Non-Uniformity)描述的是在同一均匀光照下,不同像素输出响应存在稳定差异。它属于乘性误差,更准确地说:
\[P(x,y) = \alpha(x,y) \cdot S(x,y) + \beta(x,y) + n(x,y)\]其中:
只有在充分去除偏移类误差后,PRNU才容易被准确测量和校正。
PRNU常以百分比表示:
\[PRNU = \frac{\sigma_{flat}}{\mu_{flat}} \times 100\%\]这里 $\mu_{flat}$ 和 $\sigma_{flat}$ 是均匀照明下像素响应的均值和标准差。
PRNU标定通常使用均匀光源(积分球或高均匀背光)拍摄平场图像。去除黑电平和暗电流后,可为每个像素或每个网格生成校正增益:
\[G_{prnu}(x,y,c) = \frac{\mu_c}{P_{flat}(x,y,c)}\]校正时:
\[P_{prnu}(x,y,c) = P_{lin}(x,y,c) \cdot G_{prnu}(x,y,c)\]为了避免单帧噪声污染,通常会对多帧平场图做平均:
\[P_{flat}(x,y,c) = \frac{1}{M}\sum_{k=1}^{M} P_k(x,y,c)\]像素级PRNU
网格级PRNU
混合式PRNU
把低频不均匀性交给网格,高频残差交给小幅修正表,是高分辨率系统常见策略。
要注意:PRNU与第5章的Lens Shading在表面上都像“乘一个增益图”,但它们来源不同。
若标定流程控制不好,这两者很容易相互污染。
设观测平场为:
\[P_{flat}(x,y) = S_0 \cdot L(x,y) \cdot R(x,y)\]其中:
如果直接把 $1/P_{flat}(x,y)$ 当作PRNU表,则实际上把镜头和传感器效应混在一起了。工业流程里常见三种解耦方法:
也就是说,PRNU和Lens Shading的划分不仅是物理问题,更是产品校准分工问题。
PRNU校正本质是乘法,会放大噪声,尤其在低响应区域更明显。
若某处响应很低,增益接近 $G_{max}$,则:
\[\sigma_{out}^2 \approx G_{prnu}^2 \cdot \sigma_{in}^2\]因此需要限制最大增益:
\[G_{prnu}(x,y,c) \le G_{clip}\]典型做法:
RAW_Linear
|
v
[Grid / Pixel Gain Fetch]
|
v
[Interpolation]
|
v
[Multiplier + Rounding]
|
v
RAW_PRNU_Corrected
关键设计点:
除了前面提到的黑电平、FPN、PRNU,传感器还存在更宏观的模式差异:
因此,需要把不同工作模式统一映射到一个共同的工程域,方便后续算法和跨相机系统使用。
最简单的归一化形式是仿射变换:
\[P_{norm} = a(m,c)\cdot P_{in} + b(m,c)\]其中:
若系统已经完成BLC和线性化,则 $b$ 通常较小;但在多路径融合场景下,保留这个自由度有助于做精细对齐。
假设名义ISO从100切到400,理论上数字响应应放大4倍,但实际可能由于模拟链路误差变成3.82倍或4.11倍。若不修正:
标定时可在一组均匀照度下拟合每档位斜率:
\[a_k = \frac{\sum_i L_i \cdot D_{k,i}}{\sum_i D_{k,i}^2}\]然后把档位 $k$ 归一化到参考档位。
对于DCG,常见情况是低亮度使用高转换增益路径,高亮度使用低转换增益路径。为了避免拼接或切换时台阶,需满足在重叠线性区:
\[a_H \cdot D_H + b_H \approx a_L \cdot D_L + b_L\]可在重叠曝光区做最小二乘拟合:
\[\min_{a_H,b_H,a_L,b_L} \sum_i \left[(a_H D_{H,i}+b_H) - (a_L D_{L,i}+b_L)\right]^2\]对HDR融合而言,这一步是后续权重计算可靠性的基础。
在环视、双目、三目和具身智能多相机系统中,增益与偏移校准还承担“跨相机一致性”任务。
若相机A和B看同一灰卡,但输出不同,则:
因此常用一层跨相机归一化:
\[P_i' = \gamma_i \cdot P_i + \eta_i\]其中 $i$ 表示不同相机,$\gamma_i,\eta_i$ 由整机标定得到。
增益与偏移校准最大的工程难点不是公式,而是参数爆炸。参数维度可能同时依赖:
因此寄存器与NVM表项设计应遵循:
综合本章内容,一个工程上稳健的RAW校正流程可写为:
\[\begin{aligned} P_1 &= \max(P_{raw} - B_c,\ 0) \\ P_2 &= \max(P_1 - D_{dark}(T,t_{exp},g_a),\ 0) \\ P_3 &= P_2 - O_{row}(x) - O_{col}(y) \\ P_4 &= f_m^{-1}(P_3) \\ P_5 &= P_4 \cdot G_{prnu}(x,y,c) \\ P_{out} &= a(m,c)\cdot P_5 + b(m,c) \end{aligned}\]这里每一步都对应明确的物理含义:
对不同产品,步骤顺序和细节可以变化,但总体原则不变:先处理加性误差,再处理乘性误差,再做模式归一化。
原始数据校正是ISP前端中最“底座化”的部分。它不直接创造“漂亮的画面”,但决定了后续所有图像与视觉算法是否建立在可信信号之上。
本章关键点如下:
关键工程原则:
练习4.1 黑电平减法计算
某12bit传感器在RGGB四个平面的黑电平分别为:$B_R=64$,$B_{Gr}=60$,$B_{Gb}=62$,$B_B=68$。某个蓝色像素原始值为92。
Hint: 直接按对应颜色平面减去黑电平。
练习4.2 温度相关暗电流估算
已知25°C时暗电流为12 e-/s,温度每升高8°C翻倍。请计算73°C、曝光时间10ms时的平均暗电荷。
Hint: 先算温度相对25°C升高了多少个8°C。
练习4.3 列FPN校正
某暗场图像4列的列均值分别为[70, 74, 69, 75],全局均值为72。请给出每列的偏移校正量。
Hint: 列偏移可用列均值减全局均值。
练习4.4 PRNU增益计算
某绿色平面平场标定后,全局均值为1000,某像素响应为920。请计算该像素的PRNU校正增益,并说明这是“增亮”还是“减亮”。
Hint: 增益等于均值除以该像素响应。
练习4.5 线性化LUT压缩设计
输入RAW为12bit,理想全精度线性化LUT需要4096项。现在只允许存储256项LUT,请设计一种兼顾低码值精度和硬件成本的方案,并说明为什么低码值区应分配更多节点。
Hint: 从噪声建模、暗部精度和插值误差三个角度思考。
练习4.6 PRNU与Lens Shading边界划分
你在均匀光场下得到一个明显中心亮、边缘暗的增益图。请分析其中哪些成分可能属于PRNU,哪些更可能属于Lens Shading,并给出一种工程上可行的拆分办法。
Hint: 关注空间频率。
练习4.7 多增益档位对齐
某传感器在同一均匀照度下,ISO100档输出均值为800,ISO400档输出均值为3050。理论上ISO400应是ISO100的4倍。
Hint: 先求 $3050/800$,再与4比较。
练习4.8 车载高温场景的校正策略
为一颗车规摄像头设计RAW前端校正策略,工作温度范围为-40°C到125°C,要求在隧道出口和夏季暴晒后都保持响应稳定。请说明:
Hint: 区分“快速漂移”和“稳定结构误差”。
问题:认为两者都属于“暗场偏移”,只做一个统一常数减法。
后果:长曝光、高温场景下补偿严重不足。
建议:把“静态基线偏移”和“随曝光积分的暗信号”拆开建模。
问题:先做PRNU或其他增益校正,再做BLC。
后果:黑偏置被不必要放大,暗部误差显著。
建议:遵循“先减法、后乘法”的基本顺序。
问题:直接把列均值变化视为列偏移。
后果:垂直纹理被误消除,图像出现反向条纹。
建议:加入低纹理掩码、多帧平滑和最大修正幅度限制。
问题:直接拟合实验数据,未处理测量噪声。
后果:输出出现局部非单调,破坏直方图和3A统计。
建议:对LUT生成过程增加单调性约束。
问题:第4章和第5章都对同一低频空间不均匀性做了乘法校正。
后果:边缘过度增益,噪声被放大。
建议:明确标定分工,或在工具链中对两张增益图做联合审查。
问题:普通模式、HDR模式、DCG模式共用一套参数。
后果:切换时亮度台阶、噪声模型失配、融合错误。
建议:参数必须按模式建表,并通过帧同步切换。
问题:标定报告只给均值RMSE。
后果:少量极端列、热点或模式边界问题被掩盖。
建议:同时检查最大误差、百分位误差和空间热图。