052、黑电平校正(BLC)实战:暗电流补偿算法与温度自适应调优策略

📅 2026/7/16 15:12:59
052、黑电平校正(BLC)实战:暗电流补偿算法与温度自适应调优策略
052、黑电平校正BLC实战暗电流补偿算法与温度自适应调优策略一、一个让我熬夜三天的Bug2018年夏天某款旗舰手机项目Sensor是IMX586ISP用高通Spectra 380。整机在常温下拍照一切正常但到了可靠性测试——高温65℃环境箱里暗光场景下画面出现了明显的“紫边”和“偏绿”现象。更诡异的是同一台机器放回常温半小时问题自动消失。当时团队里有人怀疑是镜头镀膜热胀冷缩有人怀疑是Sensor的RGGB通道增益不一致。我花了三天时间逐帧dump raw图发现一个规律温度升高后Sensor输出的暗场像素值遮光像素OB整体抬升了约12个DN10bit raw但ISP的BLC模块还在用常温下标定的固定值做减法。这就是典型的黑电平校正失效——暗电流随温度漂移而补偿值没跟上。二、黑电平到底在补偿什么很多人以为BLC就是“把全黑画面的像素值减到0”这是错的。Sensor在完全无光条件下像素依然会输出一个非零值这个值由两部分组成固定模式噪声FPN每个像素的偏移量不同但相对稳定一次标定即可。暗电流噪声随温度指数级增长每升高10℃暗电流大约翻倍。这是BLC要动态补偿的核心对象。Sensor设计时会在像素阵列边缘留出一圈“光学黑像素”Optical BlackOB这些像素被金属遮挡永远接收不到光。OB像素的输出值就是当前温度下暗电流的实时采样。BLC的数学本质很简单校正后像素值 原始像素值 - OB均值但实战中这个减法远没有看起来那么简单。三、OB采样策略别被均值骗了第一次写BLC代码时我直接取所有OB像素的算术平均值结果在低光场景下画面出现横向条纹。排查发现OB行和有效像素行在读出时序上存在差异——Sensor的模拟读出电路在每行开始时有短暂的建立时间导致前几行OB值偏高。正确的做法剔除OB区域的前N行N取决于Sensor的读出建立时间通常3-5行只取稳定后的OB行做均值。这里踩过坑——某次换Sensor型号后忘了调整N值暗角校正全乱套。更精细的做法是分通道统计。RGGB四个通道的暗电流特性不同B通道对温度最敏感硅基材料对短波长的量子效率随温度变化更大G通道次之R通道最稳定。所以// 别这样写所有通道共用一个OB均值blc_offsetmean(all_ob_pixels);// 应该这样写分通道统计blc_offset_rmean(ob_pixels_under_r_channel);blc_offset_grmean(ob_pixels_under_gr_channel);blc_offset_gbmean(ob_pixels_under_gb_channel);blc_offset_bmean(ob_pixels_under_b_channel);分通道补偿后高温下的偏色问题能改善80%。剩下的20%来自OB像素本身的热噪声方差——单帧OB均值不够稳定需要多帧滤波。四、温度自适应从查表到在线学习早期方案是查表法在实验室用温箱标定-20℃到85℃的OB值存成LUT。但有两个致命问题标定成本高每个Sensor型号、每个增益档位都要标一个项目光标定就要两周。老化漂移Sensor使用半年后暗电流特性会变化出厂LUT失效。后来在车载项目上被逼出了新方案——在线自适应。核心思路利用Sensor的OB区域做实时温度感知同时用有效像素区域的“伪暗场”做校验。具体实现分三步第一步粗调——基于OB实时统计每帧计算当前OB均值与上一帧做IIR滤波系数0.3-0.5别用0.1以下响应太慢。滤波后的值作为当前帧的BLC偏移量。第二步细调——利用场景中的“真黑”区域在画面中寻找亮度极低的像素块比如暗光下的黑色物体这些区域的理想值应该是0。如果经过粗调后这些区域的平均值仍大于某个阈值比如10个DN说明OB统计存在偏差比如OB区域被污染或Sensor读出异常需要做二次补偿。第三步温度-增益联合补偿暗电流不仅随温度变化还随Sensor增益Analog Gain变化。增益越高暗电流被放大的倍数越大。所以补偿公式应该是blc_final blc_ob_mean * (1 k * (gain - gain_ref))其中k是温度-增益耦合系数需要在实验室标定一次但比全温区标定简单得多。这里有个经验值对于BSI工艺的Sensork大约在0.02-0.05之间对于FSI工艺k可能到0.1。五、实战中的三个坑坑一OB区域被污染某次量产发现手机在强光下拍照画面出现“黑斑”。排查发现镜头边缘的杂散光照射到了OB区域导致OB均值偏高BLC过度补偿有效像素被减到负值ISP clamp后变成全黑。解决方案在OB区域外围再加一圈“保护行”这些行的像素值不参与统计只作为光隔离带。坑二BLC与数字增益的时序冲突ISP pipeline中BLC通常在数字增益Digital Gain之前。但如果数字增益很大比如暗光场景下增益到4xBLC的微小误差会被放大。一个常见错误先做BLC再做数字增益结果暗电流噪声被放大到肉眼可见。正确顺序应该是BLC → 去噪 → 数字增益。去噪模块放在中间可以抑制BLC残留的随机噪声。坑三HDR多帧合成的BLC一致性在HDR模式下短帧和长帧的曝光时间不同暗电流积累量不同。如果每帧独立做BLC合成时会出现亮度跳变。解决方案以长帧的OB值为基准短帧的BLC偏移量按曝光时间比例缩放。比如长帧曝光30msOB均值为50短帧曝光5msOB均值应为50 * (5/30) ≈ 8.3。别直接用短帧自己的OB统计因为短帧的OB信噪比太低统计误差大。六、调试工具与判断标准在实验室调试BLC时我习惯用三个指标暗场均匀性全黑环境下raw图各通道的均值应接近0标准差应小于1个DN10bit。如果标准差大于2说明BLC没做好或者Sensor的FPN标定有问题。温度漂移量从25℃到65℃OB均值变化应控制在3个DN以内。超过5个DN说明温度自适应算法没生效。极限场景鲁棒性在-20℃低温下OB值可能降到接近0此时BLC不能过度补偿不能把有效像素减到负值。需要设置一个最小补偿阈值比如至少保留2个DN的偏置防止负值clamp导致细节丢失。七、个人经验做了十几年BLC最大的感悟是黑电平校正不是简单的减法而是对Sensor物理特性的建模。每个Sensor型号的暗电流特性都不一样甚至同一片wafer上不同die都有差异。量产时最好在模组端做一次OB标定把每个模组的OB基准值写入OTPISP在初始化时读取。另外别迷信“全自动自适应”。在极端场景下比如Sensor温度从-20℃瞬间跳到60℃OB统计的响应速度跟不上需要配合硬件温度传感器做前馈补偿。我见过一个方案在Sensor PCB上贴一个热敏电阻温度变化超过5℃/s时强制使用查表值等OB统计稳定后再切回自适应模式。最后说一句BLC调好了用户感知不到调不好所有后续的ISP模块AWB、CCM、Gamma都会跟着错。它就像地基看不见但决定了整栋楼的高度。