4. 黑电平校正(BLC)问题定位

黑电平校正,圈里人常叫 BLC。说白了,就是告诉芯片“什么是真正的黑色”。

你想想看,sensor 在完全没有光照的时候,理论上应该输出 0。但实际呢?由于暗电流、电路噪声这些物理因素,它总会输出一个非零的底值。这个底值如果不扣掉,整张图就会发灰、发雾,暗部细节全被埋掉了。

我个人习惯把 BLC 看作 ISP 流水线的“地基”。地基没打好,后面做 AWB、CCM、Gamma 都是白费功夫。

核心一句话:BLC 就是给每个像素减去一个“黑电平基准值”,让纯黑场景的像素值归零。

4.1 BLC 原理与硬件实现

高通平台上的 BLC 通常在 RAW 域的最前端执行。sensor 送出来的 RAW 数据,先过 BLC,再过 DPC(坏点校正),然后才进 LSC 和去噪模块。

BLC 的数学模型很简单:

P_out = max(0, P_in - B_offset)

其中 B_offset 就是黑电平偏移量。这个值怎么来的?一般有两种方式:

  • OB(Optical Black)区域统计:sensor 边缘有一圈被遮挡的像素,它们永远收不到光。芯片实时统计这些像素的平均值,作为动态黑电平。
  • 寄存器预设值:有些场景下 OB 区域不可靠(比如长曝光、高增益),工程师会直接写死一个固定值。

我在项目中遇到过一种情况:某款 sensor 的 OB 区域有漏光,统计出来的黑电平偏高,导致整张图暗部被“切掉”了。后来我们改用固定值 + 温度查表补偿才解决。

BLC 模式 优点 缺点 高通平台配置项
OB 动态统计 自适应温度/增益变化 OB 区域易受干扰 blc_ob_enable
固定值模式 稳定、可预测 需要标定,温度漂移 blc_fixed_offset
混合模式 兼顾稳定与自适应 配置复杂 blc_hybrid_mode
小技巧:调试时可以用高通 QCamera 工具抓 RAW 图,直接看 OB 区域的像素均值。如果 OB 均值波动超过 2-3 个 DN,说明 sensor 的 OB 稳定性有问题,建议切固定值模式。

4.2 参数配置错误导致的典型问题

BLC 参数配错了,画面会出什么毛病?我总结了三种最常见的:

4.2.1 偏色(尤其是暗部偏绿/偏紫)

为什么偏色?因为不同颜色通道的黑电平基准不一样。R、Gr、Gb、B 四个通道的暗电流特性不同,BLC 需要分别配置。

如果你偷懒,四个通道用了同一个偏移量,那在暗部区域,某个通道的底噪没扣干净,就会偏色。我见过最夸张的一次,暗部偏紫到像加了滤镜,查了半天发现是 Gb 通道的 BLC 偏移量写错了 4 个 DN。

4.2.2 暗部细节丢失(黑切)

这个更常见。BLC 偏移量设得太大,把原本有信号的暗部像素直接减到 0 以下,然后被 max(0, ...) 截断了。结果就是暗部一片死黑,什么细节都没有。

我曾经在调试一款夜视摄像头时,发现 0-10 lux 下的图像暗部全是纯黑块。用 hist 工具一看,0 值像素占比超过 30%。最后把 BLC 偏移量从 64 降到 48,暗部细节就回来了。

4.2.3 整体亮度偏暗或偏亮

BLC 偏移量偏大,整体亮度会偏暗;偏小,整体会偏灰。这个比较好理解,但容易被误判成 AE 问题。

避坑指南:我曾经在调试时,发现画面整体偏暗,第一反应是调 AE 目标亮度。调了半天没效果,最后才意识到是 BLC 偏移量设大了。所以,遇到亮度异常,先查 BLC,再查 AE,顺序别搞反了。

4.3 实战案例:RAW 图黑电平异常排查

下面分享一个我亲手处理过的案例。某款手机在暗光下拍照,画面暗部有明显的“绿雾”现象。

4.3.1 问题现象

  • 场景:室内 50 lux,荧光灯照明
  • 现象:暗部区域(沙发阴影、墙角)呈现不均匀的绿色
  • 严重程度:中等,用户反馈“照片脏脏的”

4.3.2 排查步骤

  1. 抓 RAW 图:用 QCamera 抓一张 RAW 图,关闭所有 ISP 模块,只看 RAW 数据。
  2. 查看 OB 区域:在 RAW 图的 OB 区域(通常是左侧或上侧的几行/几列像素),统计 R、Gr、Gb、B 四个通道的均值。
  3. 发现异常:Gb 通道的 OB 均值是 72,而其他三个通道是 64。Gb 通道的黑电平比其他通道高了 8 个 DN。
  4. 检查配置:查看 sensor 驱动中的 BLC 配置,发现四个通道的偏移量都写的是 64。
  5. 定位根因:Gb 通道的 OB 均值偏高,但 BLC 偏移量没跟上,导致 Gb 通道的底噪没扣干净。在暗部区域,Gb 通道残留的底噪被放大,就形成了“绿雾”。

4.3.3 解决方案

将 Gb 通道的 BLC 偏移量从 64 改为 72,其他通道保持不变。重新抓图验证,暗部绿色消失。

// 修改前
blc_config.r_offset = 64;
blc_config.gr_offset = 64;
blc_config.gb_offset = 64;  // 问题在这里
blc_config.b_offset = 64;

// 修改后
blc_config.r_offset = 64;
blc_config.gr_offset = 64;
blc_config.gb_offset = 72;  // 根据 OB 统计值修正
blc_config.b_offset = 64;
经验总结:BLC 参数不能“一刀切”。每个通道的黑电平基准都要单独标定。尤其是 Gb 和 Gr 通道,虽然都是绿色,但物理位置不同,暗电流特性可能有差异。

4.4 BLC 调试的通用流程

下面这张图是我自己总结的 BLC 调试流程,每次遇到黑电平问题,我都按这个步骤走,基本不会漏掉关键点。

BLC 问题排查流程图 抓取 RAW 图 统计 OB 区域四通道均值 各通道均值是否一致? 是 → 检查固定值配置 否 → 按通道单独标定 验证暗部偏色/黑切 更新驱动参数 全场景回归验证 注意:OB 区域统计前,先确认 sensor 的 OB 行/列位置是否正确,避免读到有效像素区

4.5 高通平台 BLC 调试要点

最后,分享几个高通平台上的实操要点:

  • 确认 OB 位置:不同 sensor 的 OB 区域位置不同,有的在左侧,有的在上方。配置错了,BLC 就废了。
  • 温度补偿:暗电流随温度变化。如果产品工作温度范围宽(-20°C ~ 60°C),建议做温度查表补偿。
  • 增益联动:高增益下,暗电流会被放大。有些平台支持 BLC 偏移量随模拟增益线性增加,记得开启。
  • 验证工具:用高通的 camx_analyzer 工具,可以直接看 RAW 图的 OB 统计直方图,比手动算快得多。
我的习惯:每次拿到新 sensor,第一件事就是盖住镜头拍一张全黑图,看四个通道的 OB 均值。这个数据能告诉我很多信息——sensor 的底噪水平、通道一致性、甚至有没有坏点。