3、镜头阴影校正(LSC):亮度与色彩阴影的成因、校正算法原理、网格标定与调试技巧
镜头阴影校正,圈里人常叫 LSC。说白了,就是解决照片四周发暗、发偏色的问题。
我刚开始做 ISP 时,觉得这玩意儿不就是乘个增益嘛,有啥难的?直到第一次拿到一颗大光圈广角镜头,拍出来的照片四角暗得跟戴了墨镜似的,中间还泛红……嗯,从那以后我再也不敢小看 LSC 了。
3.1 阴影的成因:亮度与色彩
阴影分两种:亮度阴影和色彩阴影。它们经常同时出现,但成因不同。
| 类型 | 成因 | 表现 |
|---|---|---|
| 亮度阴影 | 镜头光学设计导致边缘进光量减少(cos⁴ 定律) | 四角变暗,中心亮 |
| 色彩阴影 | 不同波长光线通过镜头时折射率不同,CMOS 不同通道响应差异 | 边缘偏红或偏蓝,尤其暗处明显 |
为什么会这样?你想想看,镜头中心的光线几乎是直射到 sensor 上的,而边缘的光线是斜着进来的。斜着进来,光程更长,能量更分散,自然就暗了。这就是经典的 cos⁴ 定律在作祟。
色彩阴影更隐蔽。我记得有一次调试一颗 6P 镜头,中心白平衡完全正常,但到了画面左上角,R 通道增益比 G 通道高了将近 8%。这就是典型的色彩阴影——镜头对不同波长的光做了「选择性衰减」。
关键认知:亮度阴影是「量」的问题,色彩阴影是「质」的问题。校正时,先搞定亮度,再处理色彩,顺序不能乱。
3.2 校正算法原理
LSC 校正的核心思路很简单:给每个像素算一个增益,把衰减补回来。
但怎么算这个增益?业界主流做法是网格模型。
3.2.1 网格模型
把图像分成 M×N 个网格,每个网格顶点存一个增益值。校正时,对网格内的像素做双线性插值,算出每个像素的增益。
公式长这样:
Gain(x, y) = (1 - dx) * (1 - dy) * Gain[i][j]
+ dx * (1 - dy) * Gain[i+1][j]
+ (1 - dx) * dy * Gain[i][j+1]
+ dx * dy * Gain[i+1][j+1]
Pixel_out(x, y) = Pixel_in(x, y) * Gain(x, y)
dx 和 dy 是像素在网格内的归一化偏移量。这个插值计算量不大,硬件实现非常友好。
3.2.2 分通道处理
我个人的习惯是:R、Gr、Gb、B 四个通道分别标定、分别存储增益网格。为什么?因为色彩阴影在不同通道上的表现完全不同。
| 通道 | 典型阴影特征 | 校正策略 |
|---|---|---|
| R | 边缘衰减最严重,常偏暗 | 增益较大,需平滑处理 |
| Gr / Gb | 两者差异反映色彩阴影 | 分别标定,消除色差 |
| B | 短波衰减快,边缘偏蓝 | 增益适中,注意噪声放大 |
避坑指南:我曾经在 Gr 和 Gb 通道上偷懒,只标了一个通道然后共用。结果在低色温场景下,画面出现了明显的「棋盘格」纹理——因为 Gr 和 Gb 的阴影曲线根本不一样。从那以后,我再也不敢合并标定了。
3.3 网格标定流程
标定是 LSC 调试中最枯燥、也最容易出错的环节。我总结了一套标准流程:
- 准备均匀光源——积分球或灯箱,保证整个画面照度均匀度 < 1%
- 拍摄灰卡——18% 中性灰卡,覆盖整个视场角
- 采集原始数据——关闭所有 ISP 模块,直接拿 RAW 图
- 计算增益网格——以图像中心为参考,计算每个网格点的增益
- 平滑与裁剪——对增益网格做低通滤波,防止校正后出现纹理
- 写入参数——将网格系数写入 sensor 校准文件或 ISP 寄存器
这里有个细节:网格分辨率怎么选?
| 网格分辨率 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 4×4 | 参数少,存储小 | 校正精度低,边缘过渡生硬 | 低端 sensor,要求不高 |
| 8×8 | 精度与存储平衡 | 中等 | 主流手机、安防 |
| 16×16 | 高精度,适应复杂镜头 | 参数多,标定工作量大 | 高端旗舰、车载 |
我个人建议:起步用 8×8,调试稳定后再根据实际效果决定是否加密。
3.4 调试技巧与避坑
调试 LSC 时,有几个坑我踩过不止一次,分享给你:
警告:增益过大导致噪声放大
边缘增益如果超过 2.5 倍,暗部噪声会被放大到不可接受的程度。我曾经在某个项目里把增益拉到 3.2 倍,结果画面边缘全是彩色噪点。解决方案:要么限制最大增益,要么在边缘区域做额外的降噪处理。
3.4.1 色彩阴影的调试顺序
我的调试顺序是:
- 先调亮度阴影,让画面亮度均匀
- 再调色彩阴影,消除偏色
- 最后做白平衡验证,确保校正后不引入新的色偏
为什么这个顺序?你想想看,亮度不均匀的时候,你看到的「偏色」可能只是亮度差异造成的视觉假象。先把亮度拉平,色彩问题才暴露得真实。
3.4.2 边界处理
图像边缘的像素,插值时可能超出网格范围。我习惯的做法是:
- 对边缘像素做「边界复制」——用最外一圈网格的增益值
- 或者预留一圈虚拟网格,让插值始终在有效范围内
前者简单,后者更平滑。看你的硬件资源决定。
3.4.3 温度漂移
这个很多人会忽略。sensor 在不同温度下,阴影特性会发生变化。我遇到过冬天调试好的 LSC 参数,夏天一用,边缘偏色了。
解决方案:
- 在多个温度下标定(-20°C、25°C、60°C)
- 根据温度传感器做参数切换或插值
3.5 LSC 校正知识体系
下面这张图总结了 LSC 的核心知识结构,方便你对照理解:
3.6 实战案例:一次色彩阴影调试
最后分享一个真实案例。
去年做一款 48M 主摄,镜头是 6P 广角。第一次出图,中心画质很好,但左上角明显偏红,右下角偏青。
我当时的排查步骤:
- 确认亮度阴影已校正——用均匀灰卡测,亮度均匀度 < 3%,OK
- 检查 R/B 通道增益网格——发现左上角 R 增益比中心高 12%,B 增益只高 3%
- 问题锁定:R 通道增益过大,导致 R/B 比例失衡
- 解决方案:重新标定 R 通道网格,同时限制最大增益不超过 2.0x
- 验证:偏色消除,但边缘 SNR 从 38dB 降到 32dB——这是代价
后来我加了一级边缘降噪,SNR 回到 35dB,才算勉强过关。
经验总结:LSC 调试的本质是「在均匀性和噪声之间找平衡」。没有完美的校正,只有可接受的妥协。每次调整增益,都要问自己:这个增益值,噪声能接受吗?