3、RAW域处理(一):黑电平校正(BLC)原理与调试、镜头阴影校正(LSC)原理与调试
各位好,欢迎来到RAW域处理的第一讲。说实话,RAW域是整个ISP pipeline的基石,你前面要是没打好基础,后面做AWB、CCM、Gamma都会遇到各种莫名其妙的问题。今天咱们就先把黑电平校正(BLC)和镜头阴影校正(LSC)这两个最基础、也最容易出坑的模块讲透。
3.1 黑电平校正(BLC)
3.1.1 为什么要有黑电平?
先问一个问题:你把镜头盖盖上,sensor拍出来的像素值应该是0吗?
答案是:不是0。因为sensor本身有暗电流,ADC也有一个固定的偏置电压。这些因素叠加起来,就会让全黑画面下每个像素都有一个非零的读数。这个读数,就是黑电平(Black Level)。
我刚开始做ISP调试那会儿,拿到一块新的sensor,直接拿全黑图看直方图,发现均值在64左右(12-bit raw)。当时我还以为是sensor坏了,后来问了FAE才知道,这就是正常的黑电平值。
核心概念:黑电平校正的目的,就是把全黑画面下的非零读数减掉,让“真正的黑”回到0附近。这样后续的增益、Gamma等处理才不会把噪声也一起放大。
3.1.2 BLC的两种实现方式
实际项目中,BLC主要有两种做法:
| 方式 | 原理 | 适用场景 | 优缺点 |
|---|---|---|---|
| 全局固定值 | 从每个像素减去一个固定的offset | sensor一致性好的场景 | 简单、快,但无法应对行间差异 |
| 动态OB(Optical Black) | 利用sensor边缘的遮光像素实时计算offset | 温度变化大、增益变化大的场景 | 自适应强,但需要硬件支持OB区域 |
我个人习惯用动态OB的方式。为什么呢?因为温度一变,暗电流就跟着变。你想想看,手机在冬天室外和夏天车内,sensor温度能差30度以上,固定offset根本扛不住。
3.1.3 调试步骤与参数
BLC调试其实不复杂,但有几个关键点要注意:
- 采集全黑图:盖上镜头盖,用你目标场景的增益和曝光时间拍一张raw图。
- 计算均值:取OB区域或者全图的像素均值。注意要排除坏点和边缘。
- 设置offset:把均值作为offset写入寄存器。
- 验证:再拍一张全黑图,确认校正后均值接近0。
小技巧:如果你用的是12-bit raw,校正后的黑电平目标值建议设在16~32之间,不要硬拉到0。留一点点余量,可以避免后续处理中因为减过头导致负值被截断。
3.1.4 避坑指南
我曾经踩过的坑:有一次调试一款高灵敏度sensor,全黑图校正后看起来没问题,但一开灯拍,暗部出现了明显的偏色。查了两天才发现,BLC的offset是按R/G/B通道分别设置的,但sensor的暗电流在不同通道上不一样。后来我改成每个通道独立计算offset,问题就解决了。
所以,BLC调试一定要分通道做。别偷懒。
3.2 镜头阴影校正(LSC)
3.2.1 阴影是怎么来的?
你拍一张纯白均匀的墙面,看看四角是不是比中心暗?这就是镜头阴影(Lens Shading),也叫亮度均匀性问题。
原因主要有两个:
- 光学原因:镜头中心到边缘的光路长度不同,边缘的光强衰减更严重(cos⁴ law)。
- 像素角度原因:边缘像素接收光线的角度更大,微透镜效率下降。
说白了,就是镜头本身的光学特性决定了边缘天生比中心暗。LSC就是要把边缘的增益提上来,让整幅画面亮度均匀。
3.2.2 LSC的数学模型
LSC的核心是一个增益矩阵。对每个像素(x, y),乘以一个对应的增益值G(x, y):
校正后像素值 = 原始像素值 × G(x, y)
这个增益矩阵怎么来?通常有两种方式:
| 方式 | 描述 | 存储开销 | 精度 |
|---|---|---|---|
| 网格式(Mesh) | 在图像上均匀取N×N个网格点,每个点存一个增益值,中间区域插值 | 中等 | 高 |
| 多项式拟合 | 用多项式函数拟合增益曲面,存系数 | 低 | 中等 |
我建议用网格式。虽然存储开销大一点,但现在的sensor都有硬件插值引擎,精度高、调试也直观。
3.2.3 调试流程
LSC调试的核心是采集一张均匀的灰卡图。具体步骤:
- 准备灰卡:用DNP或者X-Rite的均匀灰卡,保证光照均匀度在95%以上。
- 拍摄raw图:用你目标的光源(D65、A光源等)和增益拍一张。
- 计算增益:以图像中心区域的均值为基准,计算每个网格点的增益值。
- 写入参数:把增益矩阵写入sensor的LSC寄存器。
- 验证:再拍一张,检查四角亮度是否和中心一致。
关键指标:校正后的亮度均匀性,一般要求四角与中心的偏差在5%以内。高端安防或医疗设备要求更高,可能在2%以内。
3.2.4 分通道校正
LSC不只是亮度问题,还有颜色问题。因为不同波长的光在镜头边缘的衰减程度不一样,所以R、G、B通道的阴影曲线也不同。
如果不做分通道校正,就会出现边缘偏色——通常是边缘偏绿或偏紫。
我记得有一次调试一款广角镜头,中心颜色正常,但四角明显偏紫。一开始以为是AWB的问题,后来发现是LSC的R通道增益不够,边缘的R通道比G/B弱,导致偏紫。单独调整R通道的LSC网格后,问题就解决了。
建议:LSC一定要分R、Gr、Gb、B四个通道独立调试。不要只调亮度通道,否则颜色均匀性会出问题。
3.3 BLC与LSC的联动关系
这里有个容易忽略的点:BLC和LSC的处理顺序会影响最终效果。
标准的ISP pipeline中,BLC在LSC之前。为什么?因为LSC是对像素值做乘法,如果黑电平没减干净,LSC会把黑电平的残差也放大,导致暗部出现明显的增益噪声。
你想想看:如果黑电平残差是10个DN,LSC在边缘的增益是2倍,那边缘的暗部噪声就变成了20个DN。这就是为什么有些画面边缘噪点特别明显的原因之一。
注意:调试时一定要先调好BLC,再调LSC。顺序不能乱。我曾经见过一个项目,工程师先调LSC再调BLC,结果每次调完LSC,BLC的offset又变了,来回折腾了两周才找到原因。
3.4 本章知识结构
下面这张图把BLC和LSC的核心逻辑串起来了,方便你理解整个流程:
3.5 调试参数速查表
最后,我把BLC和LSC的常用调试参数整理成一个速查表,方便你现场参考:
| 模块 | 参数名称 | 典型值范围 | 调试建议 |
|---|---|---|---|
| BLC | R通道offset | 0~255 (12-bit) | 根据全黑图均值设定 |
| Gr通道offset | 0~255 | 与Gb通道尽量接近 | |
| Gb通道offset | 0~255 | 与Gr通道尽量接近 | |
| LSC | 网格行数 | 5×5 ~ 17×17 | 广角镜头用高密度网格 |
| 网格列数 | 5×5 ~ 17×17 | 与行数保持一致 | |
| 中心增益 | 1.0 | 固定为1.0,作为基准 | |
| 边缘增益 | 1.0 ~ 4.0 | 根据镜头衰减程度调整 |
好了,BLC和LSC的核心内容就这些。这两个模块虽然基础,但直接影响整幅画面的亮度和颜色均匀性。调试时多花点时间把基础打牢,后面做AWB和CCM会省心很多。