2. RAW域处理:黑电平校正、镜头阴影校正、坏点校正
RAW域处理,说白了就是Sensor把光信号转成电信号后,我们做的第一道“清洗”工作。这时候数据还是最原始的状态,没经过任何美化。我经常跟团队说:RAW域处理做不好,后面调得再花哨也是白搭。
这一章我们重点聊三个基础操作:黑电平校正(BLC)、镜头阴影校正(LSC)、坏点校正(DPC)。它们各自解决什么问题?参数怎么配?踩过哪些坑?咱们一个一个说。
2.1 黑电平校正(BLC)
2.1.1 什么是黑电平?
你想想看,Sensor在完全无光的环境下,输出值应该是0对吧?但实际上不是。因为电路本身有暗电流,ADC也有偏置,所以输出会有一个固定的底数。这个底数,就是黑电平。
我遇到过一款Sensor,标称黑电平是64,结果量产批次测出来有的跑到72。如果不校正,暗部就会发灰,整个画面的黑场都不干净。
核心公式:
校正后像素值 = 原始像素值 - 黑电平值
注意:校正后要做Clamp,防止出现负值。
2.1.2 校正方法
常见的做法有两种:
- 全局固定值法:从Sensor的OTP或寄存器读一个固定值,全图统一减掉。简单,但精度一般。
- 动态OB(Optical Black)法:利用Sensor边缘的遮光像素(OB像素)实时计算黑电平。我个人更推荐这种,能适应温度变化。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 全局固定值 | 实现简单,计算量小 | 无法适应温度漂移 | 低成本、温度稳定的场景 |
| 动态OB法 | 实时跟踪,精度高 | 需要OB像素区域,算法稍复杂 | 高端手机、车载摄像头 |
2.1.3 参数配置要点
配置BLC时,我建议你关注这几个参数:
- 黑电平值:10bit Sensor通常在64左右,12bit的在256左右。具体看Datasheet。
- Clamp下限:一般设为0,防止负值溢出。
- OB行/列选择:有些Sensor的OB像素在顶部几行,有些在左右两侧。选错了,校正就偏了。
我曾经踩过的坑:
有一次我直接用固定值64做BLC,结果在高温环境下暗部出现紫色条纹。后来换成动态OB法,问题才解决。温度对黑电平的影响比你想象的大,千万别忽视。
2.2 镜头阴影校正(LSC)
2.2.1 阴影从哪来?
镜头本身的光学特性决定了:中心区域进光量多,边缘区域进光量少。再加上Sensor的像素角度响应,边缘会更暗。这就是镜头阴影,也叫Lens Shading。
我调过一款广角镜头,边缘亮度只有中心的40%。如果不做LSC,拍出来的照片中间亮、四周暗,像戴了个墨镜。
2.2.2 校正原理
LSC的核心思路很简单:给每个像素乘一个增益系数。中心区域增益小,边缘区域增益大。
校正公式:
校正后像素值 = 原始像素值 × Gain(x, y)
其中Gain(x, y) 通常用网格查表 + 双线性插值实现。
2.2.3 增益网格与插值
实际工程中,我们不会给每个像素单独算增益。而是把图像分成网格,比如17×13个网格点,每个点存一个增益值。中间的点通过插值得到。
我建议你注意网格密度:网格太疏,校正后会有块状痕迹;网格太密,存储和计算开销大。一般1080P分辨率用17×13就够用。
| 网格密度 | 优点 | 缺点 | 推荐分辨率 |
|---|---|---|---|
| 9×7 | 存储小,速度快 | 校正精度低,可能有条纹 | VGA以下 |
| 17×13 | 精度与性能平衡 | 中等存储 | 1080P |
| 33×25 | 校正精度高 | 存储大,计算量大 | 4K以上 |
2.2.4 参数配置流程
- 采集灰卡图像:用均匀光源拍一张灰卡,保证画面亮度均匀。
- 计算增益矩阵:以中心区域为参考,计算每个网格点的增益。
- 平滑处理:对增益矩阵做低通滤波,防止校正后出现高频噪声。
- 写入Sensor或ISP寄存器:把增益表烧录到设备中。
小技巧:
采集灰卡时,光源角度要尽量模拟实际使用场景。我见过有人用点光源拍灰卡,结果校正后边缘反而过亮。用均匀面光源才是正解。
2.3 坏点校正(DPC)
2.3.1 坏点的分类
Sensor在生产过程中,难免会有一些像素点失效。坏点分三种:
- 亮点(Hot Pixel):输出值一直很高,像个小太阳。
- 暗点(Dead Pixel):输出值一直很低,像个小黑洞。
- 闪烁点(Stuck Pixel):输出值固定不变,不随光照变化。
我记得有一次调试,画面左上角总有一个白点,怎么调都去不掉。后来用DPC工具一扫描,发现是个亮点。校正之后,画面就干净了。
2.3.2 校正策略
DPC分两步:检测和校正。
检测方法:
- 静态检测:出厂前用全黑和全白图像扫描,生成坏点列表。
- 动态检测:运行时实时判断,比如当前像素与周围8邻域的差值超过阈值,就标记为坏点。
校正方法:
- 中值滤波:用周围像素的中值替换坏点。简单,但会损失细节。
- 线性插值:根据相邻像素的梯度方向插值。效果更好,但计算量大。
| 校正方法 | 效果 | 计算量 | 适用场景 |
|---|---|---|---|
| 中值滤波 | 一般,可能模糊 | 低 | 低端芯片、实时性要求高 |
| 线性插值 | 较好,保留边缘 | 中 | 主流手机、相机 |
| 自适应插值 | 优秀,细节保留好 | 高 | 高端影像设备 |
2.3.3 参数配置建议
配置DPC时,我习惯这样调:
- 检测阈值:设得太低,会把正常像素误判为坏点;设得太高,会漏检。一般先设30(8bit数据),再根据效果微调。
- 校正强度:不要一次拉满。先做轻度校正,观察效果,再逐步加强。
- 坏点列表:静态列表要定期更新,因为坏点会随着使用时间增加。
注意:
动态DPC在低光照环境下容易误检。因为噪声大,正常像素的邻域差异也会很大。我建议在低光照时降低检测灵敏度,或者直接切换到静态列表模式。
2.4 本章知识体系
下面这张图帮你梳理三个模块的关系:
2.5 小结
RAW域处理是ISP流水线的基石。BLC解决黑底问题,LSC解决亮度均匀性问题,DPC解决像素缺陷问题。三个模块配合好了,后面的AWB、Demosaic、Gamma等模块才能发挥正常效果。
我个人习惯在项目初期就把这三个模块的参数调稳,不然后面返工的成本太高。你想想看,如果BLC没调好,暗部偏色,后面AWB怎么调都调不回来。所以,基础打牢,后面才省心。