第4章:ISP前端处理:原始数据校正

章节概述

原始传感器数据(RAW)是整条ISP流水线中最接近物理成像过程的表示形式。它既保留了最多的信息,也携带了最多的器件非理想性:黑电平偏移、列/行固定模式噪声、温度相关暗电流、ADC非线性、像素响应不一致,以及不同增益档位下的响应漂移。如果这些问题在前端没有被妥善校正,后续的Lens Shading、坏点修复、去马赛克、降噪和色彩处理都会建立在错误的信号基准之上,导致误检、色偏、动态范围损失甚至系统级不稳定。

在自动驾驶和具身智能系统中,RAW校正的要求比消费摄影更严格。系统不仅关心“画面好不好看”,更关心同一物体在不同温度、曝光、模拟增益和时间点下,是否仍然产生一致、可预测的数字响应。换言之,前端原始数据校正的目标不是简单“美化图像”,而是把传感器输出尽量还原为一个稳定、线性、可标定、可建模的信号域。

本章将系统介绍RAW前端校正链路的核心内容,包括Black Level Correction、固定模式噪声消除、暗电流补偿、线性化、PRNU校正,以及传感器增益与偏移标定。我们将同时讨论数学模型、标定方法、RTL/硬件实现结构,以及在车载与机器人场景中的工程权衡。

学习目标

  • 理解RAW数据中的主要非理想项及其物理来源
  • 掌握黑电平、暗电流、FPN、PRNU的区别与联系
  • 理解线性化LUT和增益/偏移标定在ISP前端中的作用
  • 能够设计一条硬件可落地的原始数据校正流水线
  • 理解温度、曝光时间、ISO、增益档位对校正参数的耦合关系
  • 能够为自动驾驶和具身智能场景制定更稳健的校正策略

4.1 原始数据校正链路总览

4.1.1 RAW观测模型

从系统设计角度,单个像素在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$$ 其中:

  • $S(x,y)$ 是由光子产生的有效信号
  • $I_{dark}(x,y,T)$ 是温度相关暗电流
  • $t_{exp}$ 是曝光时间
  • $O_{pix}, O_{col}, O_{row}$ 分别表示像素、列、行的固定偏移
  • $g_a$ 是模拟增益
  • $O_{adc}$ 是ADC基线偏移
  • $Q(\cdot)$ 表示ADC量化与可能的压缩编码
  • $n_q$ 是量化误差与残余噪声

这个模型说明:RAW数据并不等于“真实光照”,它是光信号、器件偏移、温漂和读出链路误差的叠加结果。ISP前端校正的本质,就是尽可能把这些非理想项从观测值中剥离出去。

4.1.2 典型处理顺序

工程上常见的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

这个顺序并非唯一,但有强烈的工程逻辑:

  1. 先减偏移,再做乘法校正。黑电平、暗电流和大部分FPN是加性误差,若在乘性校正之后再减,会被不必要地放大。
  2. 先线性化,再做依赖“相对响应”的校正。PRNU本质上是像素响应不一致,在线性域中更容易建模和补偿。
  3. 增益与偏移归一化要感知模式切换。不同ISO、DCG模式和HDR通路可能共享算法,却不共享标定参数。

4.1.3 前端校正失败的系统后果

如果RAW校正不准,后续模块通常会出现连锁反应:

  • 黑电平偏高:暗部发灰,动态范围被压缩,AE/AWB统计偏移
  • 黑电平偏低:暗部剪切,阴影细节不可恢复
  • 列FPN残留:去噪器把条纹误判为纹理,难以清除
  • 暗电流建模错误:长曝光和高温场景下出现块状亮斑
  • 线性化错误:3A统计、降噪强度和HDR融合权重全部失真
  • PRNU校正不足:均匀平面出现固定纹理,目标检测背景不稳定

对自动驾驶系统而言,更严重的问题是同一场景在不同环境条件下产生不一致特征,进而影响感知网络的域稳定性。

4.2 Black Level Correction原理与校准方法

4.2.1 什么是黑电平

理想情况下,在无光照、零信号输入时,传感器输出应为0。但真实系统不会这样工作,原因包括:

  • 像素复位电路带来的基线偏移
  • 列放大器和ADC输入失配
  • 相关双采样(CDS)后的残余偏置
  • 为避免负数截断而故意引入的数字抬升

因此,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\}$,之所以区分两个绿色,是因为上下文中它们可能处于不同列/微透镜/读出路径,偏置并不完全相同。

4.2.2 Optical Black像素与实时估计

许多传感器在有效成像区域边缘预留遮光像素(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区域。

典型做法包括:

  1. 帧级平均:对整帧OB取均值,适合稳定场景
  2. 行级更新:每行或每若干行更新一次,适合存在行漂移的读出链路
  3. 鲁棒估计:使用trimmed mean或中值,避免OB区域被偶发串扰污染

实时估计的优点是能跟踪温漂和电源漂移;缺点是若OB区域质量差,或强干扰耦合到OB像素,估计会不稳定。

4.2.3 静态标定与动态跟踪

工业产品中,黑电平通常不是“只靠实时估计”或“只靠工厂常数”,而是两者结合: $$B_c(T,g_a,m) = B_{c,ref}(m) + \Delta B_{temp}(T,m) + \Delta B_{gain}(g_a,m)$$ 其中:

  • $T$ 是温度
  • $g_a$ 是模拟增益
  • $m$ 是工作模式,如普通模式、DCG高增益模式、HDR短曝光通路等

静态标定给出各模式下的参考黑电平,动态部分则依靠OB统计、温度表或时域跟踪更新。

时域平滑常用: $$B_c^{(t)} = \alpha \cdot B_c^{(t-1)} + (1-\alpha)\cdot \hat{B}_c^{(t)}$$ 其中 $\alpha$ 一般取0.8到0.98。数值越大,噪声越小,但对快速漂移响应越慢。

4.2.4 定点实现与位宽设计

黑电平减法虽然简单,却直接决定后续模块的信号基准,位宽设计不能随意。

若输入为12bit RAW,黑电平可能在64到256码值之间。常见实现策略:

  • 输入扩展到13到14bit内部位宽,防止后续补偿产生中间负值
  • 减法后执行下限裁剪,但保留足够小数位供后续模块使用
  • 若后续还有乘法校正,建议先进入更高精度内部域,如 12bit -> 16bit

RTL结构通常很简单:

RAW In --> [Channel Select] --> [Subtract Bc] --> [Clamp] --> RAW_BLC

真正难点不在减法器,而在参数切换一致性:如果帧中途切换寄存器,可能出现前半帧用旧黑电平、后半帧用新黑电平的灾难性不连续,因此一般要使用影子寄存器和frame-sync生效机制。

4.2.5 自动驾驶场景的额外要求

车载系统常见以下特殊约束:

  • 温度范围大,黑电平不能只在室温标定
  • 多摄像头系统要求跨传感器黑场一致,便于拼接与融合
  • 功能安全场景要求OB异常可检测,例如OB均值突变、方差过大、饱和像素比例异常

因此,BLC模块往往要输出统计信息给系统监控模块,而不仅仅输出校正后的像素。

4.3 固定模式噪声(FPN)消除

4.3.1 FPN的类型

固定模式噪声(Fixed Pattern Noise, FPN)是指在相同输入条件下、空间上稳定重复出现的噪声结构。它不同于随机噪声,后者会在时间上波动;FPN在多帧平均后反而更加明显。

常见FPN可分为:

  1. 偏移型FPN(Offset FPN) - 无光照时仍存在 - 主要表现为列纹、行纹、局部偏置块

  2. 增益型FPN(Gain FPN) - 随照度增强而放大 - 本质上与PRNU相关,但更强调读出链路增益失配

  3. 列FPN / 行FPN - 由列放大器、列ADC、行选择器不匹配造成 - 是最常见、最显眼的条纹来源

  4. 模式切换FPN - 某些增益档位、HDR通路或binning模式下单独出现

在工程实现里,Offset FPN通常在黑电平/暗电流附近处理,Gain FPN与PRNU有一定重叠,但标定手段和更新节奏不同。

4.3.2 列FPN的建模与校正

假设某列存在稳定偏移 $\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:在线高通估计

对于纹理不强的区域,可用列均值减全局均值近似列偏移,但需要屏蔽强边缘和高对比目标,否则真实内容会泄漏进校正量。

4.3.3 行/列联合FPN与低秩观点

当行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若用整行统计实时更新,容易引入额外行缓存压力,因此很多系统采用“工厂标定 + 慢更新”策略。

4.3.4 FPN校正与真实纹理的冲突

FPN去除看似简单,实际容易伤害真实图像结构。最常见错误是把大面积水平/垂直纹理当成行列偏置减掉。

例如在自动驾驶场景中:

  • 栅栏、车道线、建筑百叶窗会产生强方向性结构
  • 室内机器人场景里地板纹理和货架条纹也可能与列FPN形态相似

因此,在线FPN估计通常需要:

  • 使用低纹理区域掩码
  • 多帧时域平均
  • 与历史参数比较,只允许缓慢漂移
  • 设置最大校正幅度,避免瞬时过补偿

4.3.5 硬件实现示意

RAW_BLC
   |
   v
[Address by Column/Row]
   |
   +--> [Column Offset LUT]
   |
   +--> [Row Offset LUT]
   |
   v
[Subtract / Combine]
   |
   v
RAW_FPN_Corrected

典型资源权衡:

  • 列表法:存储开销随分辨率列数线性增长,最稳定
  • 稀疏分段法:若相邻列偏移相似,可分段压缩
  • 在线估计法:节省标定表,但控制逻辑更复杂,误校正风险更高

4.4 暗电流补偿与温度依赖性

4.4.1 暗电流的来源

暗电流是指在无光条件下,由热激发产生的电子流。其主要来源包括:

  • 耗尽区的热激发
  • 界面缺陷与陷阱态释放
  • 边缘泄漏与工艺应力
  • 长曝光下的积累效应

暗电流具有两个关键特征:

  1. 与曝光时间近似成正比
  2. 对温度极其敏感

因此它与黑电平不同。黑电平更多是读出基线偏移,而暗电流是“会随时间积分增长”的电荷项。

4.4.2 基本模型

最常用的一阶模型为: $$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}$$ 这会显著降低实现成本,但无法处理空间不均匀的热像素和暗电流热点。

4.4.3 暗帧法与温度查表法

暗电流补偿常见有两套工程路径。

路径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)$$ 优点是压缩参数量;缺点是当不同模式下空间分布形态都变了时,单一模板不足以覆盖。

4.4.4 长曝光与车载高温场景

暗电流补偿在以下场景尤其关键:

  • 夜间长曝光监控
  • 车规传感器高结温环境
  • 低照机器人导航
  • HDR长曝光通路

例如参考温度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-}$$ 这已经足以显著抬升暗部,并改变后续降噪和检测模块的噪声基线。

4.4.5 暗电流与热像素的边界

暗电流补偿和坏点修复不是同一件事,但二者高度相关。

  • 大多数像素的暗电流随温度平滑变化,适合模板补偿
  • 少数像素暗电流极高,表现为热像素,更适合在第6章的坏点处理中单独修复

工程上可采用分层策略:

  1. 先做全局/局部暗电流补偿
  2. 再对残留异常亮点做热像素检测与修复

这样可以避免把大量正常暗漂移都交给坏点模块处理,导致误检率上升。

4.4.6 硬件实现与表项组织

常见硬件组织方式:

Temperature Sensor + Exposure Register + Gain Mode
                    |
                    v
             [Dark Model Selector]
                    |
                    v
          [Global / Tile / Pixel Template]
                    |
                    v
              [Scale by t_exp]
                    |
                    v
                 [Subtract]

实现层级通常有三种:

  • 全局补偿:仅一个标量,成本最低
  • Tile补偿:例如16×12热图,兼顾空间变化与存储量
  • 像素级补偿:效果最好,适合高端系统或离线模板加载

4.5 线性化处理与查找表设计

4.5.1 为什么要线性化

许多传感器并不是把光子数线性映射到数字码值。非线性可能来自:

  • 像素转换增益随电荷量变化
  • 列ADC本身的积分非线性(INL)
  • 片上传感器压缩(companding)
  • HDR模式下不同通路拼接的分段响应

而ISP后续很多模块默认“输入近似线性”:

  • 降噪强度估计依赖噪声与信号的关系
  • HDR融合需要比较不同曝光的相对亮度
  • 色彩矩阵和白平衡最好在线性域工作

因此,线性化的目标是求出一个逆映射,使输出尽可能与入射光能量成正比。

4.5.2 标定响应曲线

设传感器理想响应为 $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。

4.5.3 LUT设计方法

最常见的是1D LUT: $$P_{lin} = LUT(P_{in})$$ 若输入是12bit,则全精度LUT有4096项。为了节省面积,常用以下办法:

  1. 稀疏采样 + 线性插值 - 例如256项或512项 - 高码值区可更稀疏,低码值区更密集

  2. 分段线性模型 $$P_{lin} = a_k \cdot P_{in} + b_k,\quad P_{in}\in [T_k,T_{k+1})$$

  3. 对数/指数域压缩表 - 适合传感器使用了companding的情况

  4. 模式相关LUT - 普通模式、DCG模式、HDR短中长曝光路径分别使用不同LUT

4.5.4 LUT插值精度与单调性

线性化LUT有两个容易被低估的工程问题。

问题1:插值误差

若相邻节点跨度过大,低码值区会出现响应误差,导致暗部统计不稳定。

问题2:单调性破坏

LUT若非严格单调,可能出现输入增大而输出不增的现象,严重影响排序、直方图和3A统计。

因此,LUT生成通常应满足: $$LUT[i+1] \ge LUT[i]$$ 必要时可对标定数据做单调回归(monotonic regression)或后处理修正。

4.5.5 线性化在HDR和DCG中的作用

对于双转换增益(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)$$ 只有在统一到相同线性域后,两条路径才能无偏融合。

这也是为什么某些系统把黑电平、线性化和模式归一化视为一个联合模块,而不是三个孤立模块。

4.5.6 硬件实现与吞吐量

线性化LUT通常位于高吞吐路径中,因此要特别注意:

  • LUT读端口数是否支持每周期多个像素并行
  • 插值运算是否会引入额外流水级
  • 模式切换时LUT是否支持双缓冲
  • 是否允许同一帧内跨tile切换参数,通常不建议

典型结构:

RAW_FPN
   |
   v
[LUT Address Generator] --> [LUT SRAM]
   |                           |
   +--------> [Interpolator] <-+
               |
               v
            RAW_Linear

4.6 PRNU(光响应非均匀性)校正

4.6.1 PRNU的定义

PRNU(Photo Response Non-Uniformity)描述的是在同一均匀光照下,不同像素输出响应存在稳定差异。它属于乘性误差,更准确地说: $$P(x,y) = \alpha(x,y) \cdot S(x,y) + \beta(x,y) + n(x,y)$$ 其中:

  • $\alpha(x,y)$ 表示像素响应增益差异,对应PRNU
  • $\beta(x,y)$ 表示偏移项,对应DSNU/黑偏置类误差

只有在充分去除偏移类误差后,PRNU才容易被准确测量和校正。

PRNU常以百分比表示: $$PRNU = \frac{\sigma_{flat}}{\mu_{flat}} \times 100\%$$ 这里 $\mu_{flat}$ 和 $\sigma_{flat}$ 是均匀照明下像素响应的均值和标准差。

4.6.2 平场标定与增益图生成

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)$$

4.6.3 像素级、网格级与混合式PRNU

像素级PRNU

  • 精度最高
  • 对高分辨率传感器存储压力大
  • 对坏点和局部异常最敏感

网格级PRNU

  • 将图像划分为粗网格,存储每个格点增益
  • 运行时双线性插值
  • 存储量大幅下降

混合式PRNU

把低频不均匀性交给网格,高频残差交给小幅修正表,是高分辨率系统常见策略。

要注意:PRNU与第5章的Lens Shading在表面上都像“乘一个增益图”,但它们来源不同。

  • PRNU:传感器像素/读出链路响应差异
  • Lens Shading:镜头照度衰减与光学系统引起的空间不均匀

若标定流程控制不好,这两者很容易相互污染。

4.6.4 PRNU与Lens Shading的解耦

设观测平场为: $$P_{flat}(x,y) = S_0 \cdot L(x,y) \cdot R(x,y)$$ 其中:

  • $L(x,y)$ 是镜头渐晕/光学 shading
  • $R(x,y)$ 是像素响应差异

如果直接把 $1/P_{flat}(x,y)$ 当作PRNU表,则实际上把镜头和传感器效应混在一起了。工业流程里常见三种解耦方法:

  1. 系统级接受混合校正 - 让第4章和第5章的边界弱化 - 对固定模组产品可行

  2. 更换传感器裸片或近轴光学条件单独标定传感器响应 - 成本高,但可获得更纯净PRNU

  3. 用低阶光学模型拟合低频部分,剩余高频当作PRNU - 工程上最常见

也就是说,PRNU和Lens Shading的划分不仅是物理问题,更是产品校准分工问题。

4.6.5 乘法校正的噪声放大问题

PRNU校正本质是乘法,会放大噪声,尤其在低响应区域更明显。

若某处响应很低,增益接近 $G_{max}$,则: $$\sigma_{out}^2 \approx G_{prnu}^2 \cdot \sigma_{in}^2$$ 因此需要限制最大增益: $$G_{prnu}(x,y,c) \le G_{clip}$$ 典型做法:

  • 对增益表做上限裁剪
  • 在极低亮区降低PRNU校正强度
  • 将高频PRNU残差限制在较小幅度内

4.6.6 硬件实现

RAW_Linear
   |
   v
[Grid / Pixel Gain Fetch]
   |
   v
[Interpolation]
   |
   v
[Multiplier + Rounding]
   |
   v
RAW_PRNU_Corrected

关键设计点:

  • 乘法后位宽至少增加若干保护位
  • 对不同颜色平面使用独立表项
  • 表项更新需与模式切换绑定
  • 避免和Lens Shading重复校正

4.7 传感器增益与偏移校准

4.7.1 为什么需要统一增益与偏移

除了前面提到的黑电平、FPN、PRNU,传感器还存在更宏观的模式差异:

  • 不同模拟增益档位的实际放大倍数不等于名义值
  • 不同颜色通道的基础响应不一致
  • DCG高低转换增益路径有独立偏移和斜率
  • 多摄像头系统中不同模组存在全局响应偏差

因此,需要把不同工作模式统一映射到一个共同的工程域,方便后续算法和跨相机系统使用。

4.7.2 斜率-截距模型

最简单的归一化形式是仿射变换: $$P_{norm} = a(m,c)\cdot P_{in} + b(m,c)$$ 其中:

  • $a(m,c)$ 是模式 $m$、颜色平面 $c$ 对应的归一化增益
  • $b(m,c)$ 是残余偏移修正

若系统已经完成BLC和线性化,则 $b$ 通常较小;但在多路径融合场景下,保留这个自由度有助于做精细对齐。

4.7.3 多增益档位校准

假设名义ISO从100切到400,理论上数字响应应放大4倍,但实际可能由于模拟链路误差变成3.82倍或4.11倍。若不修正:

  • 噪声模型会失准
  • 3A跨档位切换会出现亮度跳变
  • 多帧融合难以对齐

标定时可在一组均匀照度下拟合每档位斜率: $$a_k = \frac{\sum_i L_i \cdot D_{k,i}}{\sum_i D_{k,i}^2}$$ 然后把档位 $k$ 归一化到参考档位。

4.7.4 双转换增益(DCG)路径对齐

对于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融合而言,这一步是后续权重计算可靠性的基础。

4.7.5 多摄像头系统的一致性

在环视、双目、三目和具身智能多相机系统中,增益与偏移校准还承担“跨相机一致性”任务。

若相机A和B看同一灰卡,但输出不同,则:

  • 拼接边界明显
  • 立体匹配代价不稳定
  • 视觉里程计和SLAM的光度一致性假设被破坏

因此常用一层跨相机归一化: $$P_i' = \gamma_i \cdot P_i + \eta_i$$ 其中 $i$ 表示不同相机,$\gamma_i,\eta_i$ 由整机标定得到。

4.7.6 寄存器组织与参数管理

增益与偏移校准最大的工程难点不是公式,而是参数爆炸。参数维度可能同时依赖:

  • 传感器模式
  • 分辨率与binning方式
  • 模拟增益档位
  • 曝光路径
  • 温度区间
  • 颜色通道

因此寄存器与NVM表项设计应遵循:

  1. 参数按模式分组,避免运行时交叉污染
  2. 支持影子加载和帧边界切换
  3. 支持回退到安全默认值
  4. 支持参数版本号和CRC校验

4.8 一条可落地的RAW校正流水线

综合本章内容,一个工程上稳健的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}$$ 这里每一步都对应明确的物理含义:

  • $P_1$:去掉静态基线
  • $P_2$:去掉随时间和温度积分的暗信号
  • $P_3$:去掉空间固定偏移
  • $P_4$:恢复线性响应域
  • $P_5$:补偿像素响应差异
  • $P_{out}$:统一到系统参考增益域

对不同产品,步骤顺序和细节可以变化,但总体原则不变:先处理加性误差,再处理乘性误差,再做模式归一化。

本章小结

原始数据校正是ISP前端中最“底座化”的部分。它不直接创造“漂亮的画面”,但决定了后续所有图像与视觉算法是否建立在可信信号之上。

本章关键点如下:

  1. Black Level Correction 用于去除读出基线偏移,是一切后续处理的零点参考。
  2. FPN消除 针对稳定的空间结构噪声,尤其是列/行偏移条纹。
  3. 暗电流补偿 与温度、曝光时间强相关,在高温和长曝光场景中至关重要。
  4. 线性化处理 把传感器和ADC的非线性响应映射回统一线性域,是HDR、降噪和色彩处理的基础。
  5. PRNU校正 处理像素响应不一致,但必须注意与Lens Shading的边界和噪声放大问题。
  6. 增益与偏移校准 用于对齐不同模式、不同通路和多相机系统的整体响应。

关键工程原则:

  • 先减法,后乘法
  • 先建立稳定零点,再建立统一斜率
  • 参数必须感知模式、温度和增益状态
  • 任何“在线自适应”都必须限制更新速度和最大修正幅度

练习题

基础题(帮助熟悉材料)

练习4.1 黑电平减法计算
某12bit传感器在RGGB四个平面的黑电平分别为:$B_R=64$,$B_{Gr}=60$,$B_{Gb}=62$,$B_B=68$。某个蓝色像素原始值为92。

  1. 该像素做BLC后的输出是多少?
  2. 若内部要求保留非负输出,是否需要裁剪?

Hint: 直接按对应颜色平面减去黑电平。

答案

该像素是蓝色平面,因此减去 $B_B=68$: $$P_{blc} = 92 - 68 = 24$$ 结果为24,大于0,因此不需要裁剪。

练习4.2 温度相关暗电流估算
已知25°C时暗电流为12 e-/s,温度每升高8°C翻倍。请计算73°C、曝光时间10ms时的平均暗电荷。

Hint: 先算温度相对25°C升高了多少个8°C。

答案

温升为 $73-25=48°C$,对应6个翻倍周期: $$I_{73} = 12 \cdot 2^6 = 768 \text{ e-/s}$$ 曝光时间10ms,即0.01s: $$Q_{dark} = 768 \times 0.01 = 7.68 \text{ e-}$$ 平均暗电荷约为7.68 e-。

练习4.3 列FPN校正
某暗场图像4列的列均值分别为[70, 74, 69, 75],全局均值为72。请给出每列的偏移校正量。

Hint: 列偏移可用列均值减全局均值。

答案

列偏移估计为:

  • 第1列:$70 - 72 = -2$
  • 第2列:$74 - 72 = 2$
  • 第3列:$69 - 72 = -3$
  • 第4列:$75 - 72 = 3$

若做校正,通常从每列像素中减去该偏移量,即:

  • 第1列减去-2,等价于加2
  • 第2列减去2
  • 第3列减去-3,等价于加3
  • 第4列减去3

练习4.4 PRNU增益计算
某绿色平面平场标定后,全局均值为1000,某像素响应为920。请计算该像素的PRNU校正增益,并说明这是“增亮”还是“减亮”。

Hint: 增益等于均值除以该像素响应。

答案

校正增益为: $$G_{prnu} = \frac{1000}{920} \approx 1.087$$ 因为增益大于1,所以这是一次“增亮”校正。

挑战题(深度思考)

练习4.5 线性化LUT压缩设计
输入RAW为12bit,理想全精度线性化LUT需要4096项。现在只允许存储256项LUT,请设计一种兼顾低码值精度和硬件成本的方案,并说明为什么低码值区应分配更多节点。

Hint: 从噪声建模、暗部精度和插值误差三个角度思考。

答案

可采用“非均匀分段 + 线性插值”方案:

  1. 在低码值区密集布点,例如前25%的码值范围分配50%以上节点
  2. 中高码值区逐渐稀疏
  3. 运行时通过区间查找和线性插值得到输出

原因:

  • 暗部码值小,任何少量误差都会带来较大的相对误差
  • 黑电平、暗电流和噪声估计主要影响低码值区,低码值线性化误差会直接破坏后续统计
  • 高频非线性往往也更集中在低码值附近
  • 高码值区信噪比高、相对误差更容易容忍,可减少节点节省存储

硬件上只需一张256项LUT、一个地址生成器和一个线性插值器,代价远低于4096项全查表。

练习4.6 PRNU与Lens Shading边界划分
你在均匀光场下得到一个明显中心亮、边缘暗的增益图。请分析其中哪些成分可能属于PRNU,哪些更可能属于Lens Shading,并给出一种工程上可行的拆分办法。

Hint: 关注空间频率。

答案

分析思路:

  • 大尺度、缓慢变化、近似径向对称的部分,更可能来自Lens Shading
  • 高频、局部细碎、与像素/列结构相关的部分,更可能来自PRNU或读出链路不一致

工程拆分办法:

  1. 先对增益图做低通拟合,例如径向多项式或粗网格拟合
  2. 拟合得到的低频部分划入Lens Shading模块
  3. 原始增益图除以低频拟合结果,剩余高频残差划入PRNU模块
  4. 对PRNU残差设置幅度上限,避免噪声放大

这种“低频归光学、高频归传感器”的方法不是纯物理分解,但工程上高效且稳定。

练习4.7 多增益档位对齐
某传感器在同一均匀照度下,ISO100档输出均值为800,ISO400档输出均值为3050。理论上ISO400应是ISO100的4倍。

  1. 实际增益比是多少?
  2. 若要把ISO400归一化到理想4倍,应乘以多少修正系数?

Hint: 先求 $3050/800$,再与4比较。

答案
  1. 实际增益比: $$r = \frac{3050}{800} = 3.8125$$

  2. 为了把ISO400映射到理想4倍域,需要乘以: $$k = \frac{4}{3.8125} \approx 1.0492$$

也就是说,ISO400路径还需要约4.9%的额外增益修正。

练习4.8 车载高温场景的校正策略
为一颗车规摄像头设计RAW前端校正策略,工作温度范围为-40°C到125°C,要求在隧道出口和夏季暴晒后都保持响应稳定。请说明:

  1. 哪些参数必须随温度切换或插值
  2. 哪些参数更适合工厂静态标定
  3. 如何避免在线参数更新导致画面闪变

Hint: 区分“快速漂移”和“稳定结构误差”。

答案

建议策略:

  1. 必须随温度切换或插值的参数: - 黑电平 - 暗电流模板或暗电流比例因子 - 某些模式下的残余偏移修正

  2. 更适合工厂静态标定的参数: - 线性化LUT - 列/行FPN基础表 - PRNU增益图 - 多增益档位之间的基础对齐系数

  3. 避免闪变的方法: - 参数使用影子寄存器,在帧边界统一生效 - 对在线估计量做时域平滑 - 设置参数变化上限,避免单帧跳变 - 当温度传感器异常或OB统计失真时回退到安全参数集

核心思想是:稳定结构误差靠工厂标定,温漂型误差靠有限速的在线补偿。

常见陷阱与错误 (Gotchas)

1. 把黑电平和暗电流混为一谈

问题:认为两者都属于“暗场偏移”,只做一个统一常数减法。
后果:长曝光、高温场景下补偿严重不足。
建议:把“静态基线偏移”和“随曝光积分的暗信号”拆开建模。

2. 在乘法校正之后再减黑电平

问题:先做PRNU或其他增益校正,再做BLC。
后果:黑偏置被不必要放大,暗部误差显著。
建议:遵循“先减法、后乘法”的基本顺序。

3. 在线列FPN估计被真实场景污染

问题:直接把列均值变化视为列偏移。
后果:垂直纹理被误消除,图像出现反向条纹。
建议:加入低纹理掩码、多帧平滑和最大修正幅度限制。

4. 线性化LUT不保证单调

问题:直接拟合实验数据,未处理测量噪声。
后果:输出出现局部非单调,破坏直方图和3A统计。
建议:对LUT生成过程增加单调性约束。

5. PRNU与Lens Shading重复补偿

问题:第4章和第5章都对同一低频空间不均匀性做了乘法校正。
后果:边缘过度增益,噪声被放大。
建议:明确标定分工,或在工具链中对两张增益图做联合审查。

6. 忽视模式切换一致性

问题:普通模式、HDR模式、DCG模式共用一套参数。
后果:切换时亮度台阶、噪声模型失配、融合错误。
建议:参数必须按模式建表,并通过帧同步切换。

7. 只看平均误差,不看最坏情况

问题:标定报告只给均值RMSE。
后果:少量极端列、热点或模式边界问题被掩盖。
建议:同时检查最大误差、百分位误差和空间热图。

最佳实践检查清单

建模与标定

  • [ ] 明确区分黑电平、暗电流、Offset FPN、Gain FPN、PRNU
  • [ ] 在不同温度、曝光、模拟增益和模式下采集标定数据
  • [ ] 对RGGB四个平面分别建模,而不是简单共享参数
  • [ ] 评估PRNU与Lens Shading的耦合程度
  • [ ] 为多摄像头系统准备跨相机一致性标定

硬件架构

  • [ ] 前端流水线遵循“先减法、后乘法、再归一化”
  • [ ] 所有关键参数支持影子寄存器和帧边界生效
  • [ ] LUT、增益图和偏移表支持模式索引和CRC校验
  • [ ] 乘法与插值后的内部位宽留有保护位
  • [ ] 在线统计路径与主像素路径解耦,避免互相阻塞

参数管理

  • [ ] 黑电平支持OB实时估计与工厂表项融合
  • [ ] 暗电流参数至少感知温度和曝光时间
  • [ ] FPN校正量设置变化上限和饱和保护
  • [ ] 线性化LUT保证单调性
  • [ ] PRNU增益图设置最大增益限制

验证与系统联调

  • [ ] 验证暗场、平场、灰卡、强纹理场景下的校正效果
  • [ ] 检查高温、低温、模式切换时是否出现亮度台阶
  • [ ] 观察列/行条纹在多帧平均后是否仍然存在
  • [ ] 量化线性化误差对AE/AWB/降噪/HDR的影响
  • [ ] 检查多相机拼接和立体匹配的一致性
  • [ ] 为功能安全场景输出OB异常、温度异常和参数失配告警