3、黑电平校正与线性化:黑电平原理、暗电流补偿、传感器线性响应校正

好,咱们今天聊聊黑电平校正和线性化。这两个东西,说白了就是让传感器“说真话”。

你想想看,一个CMOS传感器,它本质上就是个光电转换器。理想情况下,没有光进来,它就应该输出0。但现实呢?它总会给你一个“底数”。这个底数,就是黑电平。我刚开始做ISP的时候,就吃过这个亏。有一次调试一个夜景项目,画面总是偏紫,查了半天,最后发现是黑电平没扣干净。嗯,从那以后,我再也不敢小看这一步了。

3.1 黑电平原理

黑电平,英文叫Black Level,也叫暗电平。它代表传感器在完全无光照条件下的输出值。

为什么会有黑电平?原因有几个:

  • 暗电流:半导体器件本身的热激发产生的电子。温度越高,暗电流越大。
  • 像素复位噪声:每次读出前,像素复位电压的微小波动。
  • 读出电路偏置:ADC、放大器等模拟电路本身的工作点偏移。

我个人习惯把黑电平理解成“传感器的出厂设置”。每个像素的“出厂设置”还不一样,这就引出了暗电流补偿的问题。

3.2 暗电流补偿

暗电流补偿,说白了就是“扣底”。但怎么扣,有讲究。

传感器厂商通常会提供两种方式:

  1. 全局减固定值:简单粗暴,所有像素减去同一个黑电平值。适合低端传感器,或者对精度要求不高的场景。
  2. 逐行/逐列补偿:根据OB(Optical Black,光学黑区)像素计算每行的黑电平。OB像素是传感器边缘被遮挡的像素,它们接收不到光,只反映暗电流。

核心要点:OB像素才是真正的“暗电流参考”。我建议你永远不要用固定值去扣,除非你确定传感器温度极其稳定。

我曾经在一个项目中,用了固定值扣黑电平。结果传感器一发热,画面就开始偏色。后来改成逐行OB补偿,问题就解决了。你想想看,暗电流是随温度变化的,固定值怎么可能搞定?

暗电流补偿的典型流程:

// 伪代码:逐行OB补偿
for each row in image:
    ob_mean = average(OB_pixels[row])  // 计算该行OB像素均值
    for each pixel in row:
        pixel = pixel - ob_mean        // 减去该行黑电平
        if pixel < 0: pixel = 0       // 钳位到0

注意:OB像素的数量不能太少,否则均值不稳定。一般建议至少16个OB像素。另外,OB像素本身也有噪声,可以考虑用中值代替均值。

3.3 传感器线性响应校正

扣完黑电平,你以为就完了?还早。传感器的响应并不一定是线性的。

理想情况下,入射光强和输出数字值应该是正比关系。但实际传感器,在低亮度和高亮度区域,都会出现非线性。低亮度区域主要是噪声和暗电流的非线性,高亮度区域则是像素阱满导致的饱和。

线性校正,就是要把这个非线性拉直。怎么做?

  • 分段线性校正:把亮度范围分成几段,每段用不同的增益。简单,但分段点处会有跳变。
  • 多项式拟合:用一个多项式函数去拟合传感器的响应曲线。精度高,但计算量大。
  • LUT(查找表):预先计算好每个输入值对应的输出值,查表即可。这是最常用的方法。

我个人偏爱LUT。为什么?因为它灵活。你可以在实验室里用均匀光源拍一组灰阶图,然后拟合出LUT。以后换传感器,换镜头,只需要重新标定一次LUT就行。

小技巧:标定LUT时,一定要用积分球或者均匀光源。别用窗外自然光,那玩意儿不均匀,标出来不准。

线性校正的数学表达:

// 伪代码:LUT线性校正
uint16_t lut[4096]; // 假设12bit RAW,0-4095
for each pixel in image:
    pixel = lut[pixel]; // 查表校正

这里有个坑。LUT的输入范围是0-4095,但扣完黑电平后,很多像素值可能变成负数(被钳位到0),或者很小。所以,线性校正一定要在黑电平校正之后做。顺序不能乱。

3.4 知识体系图

下面这张图,是我自己画的。它把黑电平校正和线性化的关系讲清楚了。

黑电平校正与线性化流程 RAW 原始数据 黑电平校正 逐行OB补偿 / 全局减固定值 线性响应校正 LUT查表 / 多项式拟合 线性 RAW 数据 注意顺序 必须先做黑电平校正 再做线性校正 顺序颠倒会导致错误 温度影响 暗电流随温度升高 建议使用OB像素 实时跟踪黑电平变化

3.5 实战中的坑

最后,我分享几个实战中踩过的坑:

  • OB像素被污染:有些传感器,OB像素区域会漏光。如果你发现OB像素值异常偏高,赶紧检查模组结构。
  • LUT溢出:12bit RAW,LUT输出范围也是0-4095。但校正后,有些像素值可能超过4095。记得做饱和处理。
  • 温度突变:手机拍照时,传感器温度可能从30度升到50度。暗电流变化很大。我建议你做一个温度补偿表,根据温度动态调整黑电平。

一句话总结:黑电平校正扣的是“底”,线性校正拉的是“线”。底没扣干净,后面全是白费。线没拉直,颜色和亮度都会出问题。

好了,这一节就到这里。记住,ISP的每一步都有它的道理。别偷懒,别跳步。


专注资料整理