4. 黑电平校正(BLC)问题定位
黑电平校正,圈里人常叫 BLC。说白了,就是告诉芯片“什么是真正的黑色”。
你想想看,sensor 在完全没有光照的时候,理论上应该输出 0。但实际呢?由于暗电流、电路噪声这些物理因素,它总会输出一个非零的底值。这个底值如果不扣掉,整张图就会发灰、发雾,暗部细节全被埋掉了。
我个人习惯把 BLC 看作 ISP 流水线的“地基”。地基没打好,后面做 AWB、CCM、Gamma 都是白费功夫。
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 |
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 问题。
4.3 实战案例:RAW 图黑电平异常排查
下面分享一个我亲手处理过的案例。某款手机在暗光下拍照,画面暗部有明显的“绿雾”现象。
4.3.1 问题现象
- 场景:室内 50 lux,荧光灯照明
- 现象:暗部区域(沙发阴影、墙角)呈现不均匀的绿色
- 严重程度:中等,用户反馈“照片脏脏的”
4.3.2 排查步骤
- 抓 RAW 图:用 QCamera 抓一张 RAW 图,关闭所有 ISP 模块,只看 RAW 数据。
- 查看 OB 区域:在 RAW 图的 OB 区域(通常是左侧或上侧的几行/几列像素),统计 R、Gr、Gb、B 四个通道的均值。
- 发现异常:Gb 通道的 OB 均值是 72,而其他三个通道是 64。Gb 通道的黑电平比其他通道高了 8 个 DN。
- 检查配置:查看 sensor 驱动中的 BLC 配置,发现四个通道的偏移量都写的是 64。
- 定位根因: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;
4.4 BLC 调试的通用流程
下面这张图是我自己总结的 BLC 调试流程,每次遇到黑电平问题,我都按这个步骤走,基本不会漏掉关键点。
4.5 高通平台 BLC 调试要点
最后,分享几个高通平台上的实操要点:
- 确认 OB 位置:不同 sensor 的 OB 区域位置不同,有的在左侧,有的在上方。配置错了,BLC 就废了。
- 温度补偿:暗电流随温度变化。如果产品工作温度范围宽(-20°C ~ 60°C),建议做温度查表补偿。
- 增益联动:高增益下,暗电流会被放大。有些平台支持 BLC 偏移量随模拟增益线性增加,记得开启。
- 验证工具:用高通的
camx_analyzer工具,可以直接看 RAW 图的 OB 统计直方图,比手动算快得多。