043、BLC的动态性陷阱——温度变化1度黑电平漂移多少——从sensor暗电流模型到BLC校准策略——为什么固定BLC在冬天会偏色
去年冬天,一个量产项目在哈尔滨做冬测,凌晨四点的户外,样机拍出来的夜景暗部泛着一层诡异的紫红色。现场工程师第一反应是白平衡出了问题,调了半天AWB参数,色温从3000K拉到8000K,暗部那层紫红纹丝不动。后来把raw dump出来看,才发现黑电平整体抬高了大约12个LSB,而且R通道比B通道抬得更多——这根本不是白平衡的事,是BLC在低温下失效了。
那台样机的BLC是出厂时在25℃恒温房里标定的固定值,代码里写死了一个常量。当时没人觉得有问题,因为实验室里怎么测都正常。但到了零下二十度,sensor的暗电流特性变了,固定BLC自然就偏了。
暗电流模型:BLC漂移的物理根源
sensor的暗电流本质上是热激发产生的电子空穴对,在无光照条件下被收集到像素势阱里。这个过程的物理模型可以用Arrhenius方程近似描述:
I_dark ∝ T² · exp(-E_g / (2·k_B·T))
其中E_g是硅的禁带宽度,约1.12eV,k_B是玻尔兹曼常数。这个公式看着唬人,实际用起来有个更工程化的近似——温度每升高6-8℃,暗电流翻一倍。反过来,温度每降低6-8℃,暗电流减半。
但这里有个关键点:暗电流不是均匀分布在所有像素上的。不同颜色的滤光片(CFA)对暗电流的贡献不同,因为硅对不同波长的光吸收深度不一样,而暗电流的产生率与耗尽区的宽度和位置直接相关。R通道的暗电流通常比B通道大,因为红光在硅中的穿透深度更深,耗尽区更宽,热激发产生的载流子更容易被收集。
具体到数值,一个典型的1/2.7英寸1080p sensor,在25℃时暗电流大约在10-20 e-/s,对应到12bit ADC上可能只有1-2个LSB的偏移。但到了60℃(比如夏天车内),暗电流可能涨到100-200 e-/s,对应10-20个LSB。到了-20℃(哈尔滨冬测),暗电流虽然降下来了,但问题恰恰出在“降得不均匀”上——R通道降得比B通道多,导致暗部偏色。
温度变化1度,黑电平漂移多少?
这个问题的答案取决于sensor的具体工艺和设计,但可以给个量级参考。以我调试过的几颗主流sensor为例:
- Sony IMX系列(背照式):温度系数大约在0.3-0.5 LSB/℃(12bit),也就是说温度变化10℃,黑电平漂移3-5个LSB。
- OmniVision OV系列(前照式):温度系数稍大,约0.5-0.8 LSB/℃,因为前照式的暗电流本来就比背照式大。
- 一些高灵敏度sensor(比如安防用的星光级):温度系数可能到1 LSB/℃以上,因为这类sensor的暗电流本身就被设计得比较“敏感”。
但注意,这个系数不是线性的。在低温区(-20℃到0℃),暗电流随温度的变化率比高温区(40℃到60℃)更陡。原因在于Arrhenius公式里的指数项——温度越低,指数项变化越剧烈。所以冬测时遇到BLC漂移,往往比夏测更明显。
固定BLC为什么在冬天会偏色?
固定BLC的问题不在于“漂移”本身,而在于“漂移的不均匀性”。如果所有通道的暗电流都按同一比例变化,那固定BLC顶多造成整体亮度偏移,后期加个全局offset就能拉回来。但现实是:
- R通道的暗电流温度系数比B通道大(因为耗尽区深度不同)
- 暗电流的散粒噪声(shot noise)也随温度变化,低温下噪声降低,但固定BLC的“固定”特性导致噪声底被错误估计
- 部分sensor的暗电流还受电压影响,而电压本身也随温度漂移
结果就是:冬天温度降低,R通道的暗电流下降幅度大于B通道,固定BLC(在25℃标定的)在低温下对R通道“过补偿”,对B通道“欠补偿”。反映到图像上,暗部就偏紫红——因为R通道被抬高了,B通道被压低了。
动态BLC校准策略
解决这个问题,业界有几种做法,从简单到复杂:
方案一:温度查表法(最常用)
在sensor附近放一颗热敏电阻(NTC),或者直接读sensor内部的温度寄存器(大部分sensor都有)。标定时在-20℃、0℃、25℃、45℃、60℃几个温度点分别测黑电平,存成一张查找表。运行时根据当前温度插值得到BLC值。
这个方案的坑在于:温度传感器和sensor die之间可能有热阻,读到的温度不等于sensor实际工作温度。特别是sensor自身发热(功耗大的sensor,比如4K60帧,功耗可能到1W以上),die温度比环境温度高10-20℃很正常。所以标定时要区分“环境温度”和“die温度”,最好用sensor内部温度寄存器,而不是外部NTC。
方案二:暗帧校准法(更精确但更贵)
每N帧插入一帧全黑帧(机械快门挡住光路,或者电子快门把曝光时间设到最短),用这帧的像素值作为当前温度下的真实黑电平。这个方案精度最高,但代价是损失一帧的曝光时间,而且机械快门有寿命问题。在手机这种消费级产品上很少用,但在工业相机、医疗内窥镜上很常见。
方案三:统计法(不依赖温度传感器)
利用图像内容本身来估计黑电平。比如找图像中最暗的1%像素,认为它们的真实值接近0,那么观测值就是黑电平。这个方案在暗光场景下很准,但在亮场景下(比如白天户外)最暗的1%像素可能也有几百个电子,估计值就偏大了。所以一般只作为辅助校准,或者用在特定场景(如星空摄影)。
方案四:混合策略(我推荐的做法)
温度查表法做粗调,统计法做细调。具体实现:
- 温度查表给出一个初始BLC值,保证大方向不错
- 每30帧做一次暗部统计,如果发现最暗1%像素的均值偏离预期超过阈值,就微调BLC
- 微调幅度限制在±5个LSB以内,防止被亮场景误导
这个方案在量产项目里验证过,冬测时暗部偏色问题基本消除,而且没有引入额外的硬件成本。
代码层面的注意事项
写BLC校准代码时,有几个坑我踩过,提醒一下:
坑一:BLC和LSC(镜头阴影校正)的顺序
BLC必须在LSC之前做。因为LSC是乘性校正,如果BLC没做干净,LSC会把BLC的误差放大——特别是画面边缘,LSC增益可能到2-3倍,BLC误差也被放大2-3倍。这个顺序错了,怎么调都调不干净。
坑二:BLC的精度和ADC位深的关系
12bit ADC的sensor,BLC值通常用整数表示,但校准后的BLC可能是小数。比如计算出来是15.3,直接取整成15,误差0.3个LSB。这个误差在暗部可能看不出来,但在高ISO下(比如ISO 3200),增益到32倍,0.3个LSB就变成10个LSB的误差,暗部噪点会明显偏色。
所以建议BLC用定点数存储,比如Q4格式(4位小数),在增益之前做补偿,补偿完再取整。代码里这样写:
// BLC用Q4格式存储,16表示1.0intblc_q4=(int)(blc_value*16+0.5);// 在增益之前补偿pixel_after_blc=pixel_raw-blc_q4/16;// 补偿后再做增益pixel_after_gain=pixel_after_blc*gain;这里踩过坑——一开始直接在增益之后做BLC,结果高ISO下暗部偏色严重,查了半天才发现是顺序问题。
坑三:温度查表的插值方式
温度查表用线性插值就行,别用高阶多项式拟合。因为暗电流-温度曲线在宽温度范围内是非线性的,但分段线性插值在每段内误差足够小。我见过有人用三次样条拟合,结果在温度突变时(比如从室内走到室外)出现振荡,BLC值跳来跳去,图像闪烁。
坑四:BLC校准的时机
不要在每一帧都做BLC校准,特别是统计法。因为统计法需要积累一定帧数才能得到稳定的暗部统计值,帧间抖动会导致BLC值来回跳。建议每30帧做一次统计,而且要做低通滤波:
// 低通滤波,防止BLC跳变blc_filtered=blc_filtered*0.9+blc_new*0.1;别这样写——直接blc = blc_new,帧间BLC跳变会导致图像亮度闪烁,非常明显。
方法论沉淀
从BLC这个案例里,我总结出几条通用的影像调试经验:
第一条:标定条件不等于使用条件
任何在实验室里标定的参数,都要问一句:现场环境温度和实验室差多少?这个参数的温度系数是多少?如果不知道温度系数,就去做一个温度扫描实验,把-20℃到60℃的BLC曲线测出来。这个实验不难,但很多团队不做,等到冬测/夏测才暴露问题。
第二条:偏色问题不一定是白平衡问题
遇到偏色,先看raw数据,确认是乘性偏差(白平衡问题)还是加性偏差(BLC问题)。区分方法很简单:把图像亮度从暗到亮拉一条线,如果偏色在暗部明显、亮部不明显,大概率是BLC问题;如果全亮度范围都偏,才是白平衡问题。
第三条:参数校准要区分“标定值”和“运行值”
标定值是在特定条件下测得的,运行值是根据当前条件(温度、增益、曝光时间)计算出来的。两者之间要有明确的映射关系。很多团队把标定值直接当运行值用,省掉了映射这一步,短期看没问题,长期看必出故障。
第四条:所有校准参数都要有“失效保护”
如果温度传感器坏了怎么办?如果统计法在极端场景下失效怎么办?要设计一个默认值,保证在异常情况下图像还能看。比如温度传感器读数为0(开路)或0xFF(短路)时,用25℃的标定值,同时打一个日志告警。
回到冬测那个案例
后来我们怎么解决的?在sensor驱动里加了温度读取(sensor内部寄存器),标定了-20℃、0℃、25℃、45℃四个温度点的BLC值,用线性插值。同时在ISP的BLC模块里加了统计法微调,每30帧做一次暗部统计,微调幅度限制在±5 LSB。改动不大,但冬测再跑,暗部紫红消失了。
那个项目之后,我养成了一个习惯:任何新sensor bring-up,第一件事就是做温度扫描,把BLC、暗电流、固定模式噪声(FPN)随温度的变化曲线全部测出来。这个数据不仅用于BLC校准,还能指导AWB的低温补偿策略——因为sensor的光谱响应也随温度有轻微变化,虽然不如BLC那么明显,但在极端低温下也会影响白平衡。
影像调试就是这样,表面上看是某个参数不对,往深挖往往是物理模型没吃透。BLC这个例子,表面是“冬天偏色”,根因是“暗电流的温度系数在不同通道上不一致”。把物理模型搞清楚了,解决方案自然就出来了。