第一章:黑电平校正(BLC)实战——原理、校正方法、暗电流对图像的影响及调试技巧
大家好,我是老周。在手机摄像头ISP调试这个行当摸爬滚打了十几年,经手的Sensor少说也有上百款了。今天咱们来聊聊黑电平校正,也就是BLC。
说实话,BLC这玩意儿看着简单,不就是减个值嘛?但你要是调不好,后面所有模块都会跟着遭殃。我见过太多工程师,花大把时间调AWB、调CCM,结果发现是BLC没做对,白忙活一场。
1. 什么是黑电平?为什么要校正?
先说说黑电平是个啥。你想想看,一个完美的图像传感器,在完全无光的环境下,输出的像素值应该是0。但现实呢?传感器本身会有暗电流,读出电路也有偏置,导致即使全黑,输出的也不是0,而是某个固定的值。这个值,就是黑电平。
为什么要校正?说白了,如果不把这个底数减掉,你拍出来的黑色就不是纯黑,而是发灰的。更麻烦的是,这个底数会随着温度、增益、曝光时间变化,直接影响后续的AWB和色彩还原。
核心要点:BLC的目标就是让全黑场景下的R、Gr、Gb、B四个通道输出都归零,或者至少保持一致。
2. 暗电流——那个讨厌的“漏电”
暗电流是BLC要对付的头号敌人。它本质上是传感器像素点在没有光照时,由于热激发产生的电子。温度每升高6-8度,暗电流就翻一倍。我在项目中遇到过一款Sensor,夏天户外拍摄时,暗电流比实验室环境大了将近3倍。
暗电流对图像的影响主要有三点:
- 亮度偏移:暗部发亮,黑色不纯
- 固定模式噪声(FPN):每个像素的暗电流不完全相同,形成固定的条纹或颗粒
- 色彩偏差:不同通道的暗电流大小不同,导致暗部偏色
嗯,这里要注意,暗电流不是均匀的。它跟像素位置、工艺偏差都有关系。所以简单的全局减一个值,往往不够。
3. BLC校正的几种方法
根据我个人的经验,BLC校正方法大致分三类。咱们一个一个说。
3.1 全局减固定值
这是最原始的方法。在全黑环境下拍一张图,取所有像素的平均值,然后从后续每一帧中减去这个值。
// 伪代码示例
uint16_t black_level = 64; // 从全黑帧计算得到
for (int i = 0; i < frame_size; i++) {
pixel[i] = (pixel[i] > black_level) ? (pixel[i] - black_level) : 0;
}
优点:简单、快。缺点:精度差,无法处理暗电流随温度、增益的变化。说实话,现在基本没人用这个了。
3.2 行/列校正
利用Sensor的OB(Optical Black)区域。每个Sensor周围都有一圈被遮挡的像素,它们接收不到光,但能反映暗电流。用这些像素的值来校正有效像素。
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 行校正 | 每行取OB像素均值,减去该行所有像素 | 消除行方向FPN |
| 列校正 | 每列取OB像素均值,减去该列所有像素 | 消除列方向FPN |
| 行列联合 | 先做行校正,再做列校正 | 复杂场景,高精度需求 |
我曾经在一个项目里,只做了行校正,结果拍出来的照片有竖条纹。后来加上列校正,问题就解决了。所以,别偷懒,该做的都得做。
3.3 动态BLC
这是目前主流的方法。根据当前帧的增益、曝光时间、温度,动态调整黑电平值。通常用查表法或者多项式拟合。
// 动态BLC示例
float gain = get_current_gain();
float temp = get_sensor_temperature();
float black_level = blc_lut[gain_index][temp_index]; // 查表
apply_blc(black_level);
动态BLC的难点在于标定。你需要在不同增益、不同温度下采集黑电平数据,建立一张完整的查找表。这个过程很繁琐,但效果也是最好的。
4. 调试技巧与避坑指南
好了,理论说完了,咱们来点实战的。以下是我这些年踩过的坑,分享给大家。
技巧1:OB区域的选择
不是所有OB像素都能用。靠近边缘的OB像素容易受光晕影响,建议取中间区域的OB像素。我一般取OB区域中间80%的像素做平均。
技巧2:多帧平均
单帧的OB像素值有噪声,直接用来校正会引入额外噪声。建议取5-10帧做平均,再计算黑电平。
避坑指南:我曾经在调试一款高灵敏度Sensor时,发现暗部偏绿。查了三天,最后发现是BLC的Gr和Gb通道校正值不一致。两个通道的暗电流差了2个LSB,导致绿色通道偏亮。所以,四个通道要分别校正,别偷懒用同一个值。
还有一个常见的坑:BLC做过头了。有些工程师为了追求“纯黑”,把黑电平减得太多,导致暗部细节丢失,甚至出现负值截断。记住,BLC的目标是让黑色归零,不是让暗部消失。
5. BLC调试流程
我习惯的调试流程是这样的,供大家参考:
- 准备环境:暗室,温度可控(25°C、45°C、60°C三个点)
- 采集数据:不同增益(1x、2x、4x、8x)、不同曝光时间下,拍全黑帧
- 计算OB值:对每个条件,取OB区域均值,建立查找表
- 验证:在正常光照下拍灰卡,检查暗部是否偏色
- 微调:根据实际效果,微调查找表
这个流程看着简单,但每一步都有讲究。比如采集数据时,要确保Sensor完全稳定,刚上电的前几帧不能用。
6. 知识体系图
下面这张图,是我自己总结的BLC知识体系。画得不好,但意思到了。
7. 总结
BLC是ISP调试的基石。基础不牢,地动山摇。我见过太多工程师,AWB调得漂漂亮亮,结果BLC一改,全崩了。所以,花时间把BLC吃透,绝对值得。
最后说一句,调试BLC没有捷径。老老实实做标定,认认真真做验证。你偷的每一个懒,都会在最终图像上暴露出来。