4、镜头阴影校正(LSC):镜头阴影现象、LSC算法原理、LSC标定流程

镜头阴影校正,圈里人常叫它LSC。这玩意儿,说白了就是解决照片四周发暗、偏色的问题。你拿手机拍一张白墙,如果发现中间亮、四周暗,那就是典型的镜头阴影。我刚开始做ISP的时候,觉得这问题不大,直到有一次客户投诉说我们模组拍出来的照片像戴了墨镜……嗯,从那以后我再也不敢小看LSC了。

4.1 镜头阴影现象

镜头阴影分两种:亮度阴影和颜色阴影。

  • 亮度阴影(Luma Shading):图像中心到边缘亮度逐渐下降。原因很简单——镜头是个凸透镜,光线从中心直射过去损失小,从边缘斜着进去光路长、衰减大。你想想看,就像手电筒直照墙面是一个亮圆斑,斜着照就变成椭圆且暗很多。
  • 颜色阴影(Color Shading):边缘不仅暗,还偏色。这是因为不同波长的光在镜头里折射率不一样,导致R、G、B通道的衰减程度不同。我遇到过一款广角镜头,拍出来的照片边缘明显偏绿,那就是典型的颜色阴影。

实际项目中,这两种阴影往往同时出现。所以LSC要同时做两件事:提亮边缘、校正色差。

关键指标:一般要求中心到四角亮度差异控制在5%以内,色差ΔE控制在3以内。达不到这个标准,人眼就能看出问题了。

4.2 LSC算法原理

LSC的核心思路很简单:给每个像素乘一个增益系数。中心区域增益接近1.0,越往边缘增益越大。但具体怎么算,这里头有讲究。

4.2.1 增益模型

常用的增益模型有两种:

  1. 多项式模型:用二次或四次多项式拟合增益曲面。公式长这样:
Gain(r) = 1 + a1 * r² + a2 * r⁴

其中r是像素到图像中心的归一化距离。a1、a2是标定出来的系数。这个模型计算量小,适合低端芯片。但精度一般,尤其对广角镜头不太够用。

  1. 网格模型(Grid Model):把图像分成M×N个网格,每个网格存一个增益值。像素点的增益通过双线性插值得到。这是目前主流方案,精度高,但需要更多存储空间。

我个人习惯用网格模型。虽然标定麻烦点,但效果确实好。有一次做一款鱼眼镜头,多项式模型怎么调都压不住边缘偏色,换成网格模型一次搞定。

4.2.2 分通道处理

R、G、B三个通道要分别做校正。因为每个通道的阴影曲线不一样。具体做法:

  • 对每个通道单独标定增益网格
  • 校正时分别查表、插值
  • 最后合并成RGB图像

这里有个坑——G通道通常有两个(RGGB排列),它们的阴影特性略有差异。我建议对G1和G2分别标定,不要偷懒共用一组系数。

经验之谈:标定颜色阴影时,最好用D65光源。如果用其他色温的光源标定,换场景后颜色阴影可能会反弹。我吃过这个亏,后来老老实实统一用D65。

4.3 LSC标定流程

标定是LSC最关键的环节。算法再牛,标定数据不准也是白搭。整个流程分五步:

4.3.1 准备阶段

  • 搭建均匀光源箱(积分球),保证照度均匀性在99%以上
  • 准备标准灰卡(反射率18%左右)
  • 固定相机模组,确保光轴与光源垂直

我曾经遇到一个奇葩问题——标定出来的增益曲线不对称。查了半天发现是模组没装正,歪了0.5度。嗯,机械公差有时候比算法问题更头疼。

4.3.2 采集原始图像

  • 关闭所有ISP模块(只保留RAW输出)
  • 在不同曝光时间下采集多帧图像
  • 取平均去噪,得到干净的RAW图

4.3.3 计算增益网格

以网格模型为例:

// 伪代码:计算每个网格的增益
for each grid (i, j):
    // 取网格内所有像素的平均值
    avg_val = mean(pixels_in_grid)
    // 以图像中心网格为参考
    ref_val = grid_at_center.avg_val
    // 增益 = 参考值 / 当前值
    gain[i][j] = ref_val / avg_val

注意:如果某个网格的像素值太低(比如接近黑电平),计算出来的增益会异常大。需要做阈值保护。

4.3.4 平滑与校验

  • 对增益网格做低通滤波,去除噪声
  • 用标定好的参数拍一张白墙,检查校正效果
  • 如果边缘还有阴影,微调增益值
警告:增益值不要超过4.0。增益太大意味着信噪比严重下降,噪点会非常明显。如果某个区域需要超过4.0的增益,说明镜头或模组本身有问题,不是LSC能解决的。

4.3.5 参数固化

把标定好的增益网格写入模组的OTP或系统参数文件。量产时每个模组都要单独标定,因为镜头和sensor的装配公差会导致阴影特性不一样。

4.4 知识体系总览

下面这张图概括了LSC的核心逻辑,从现象到算法再到标定,一条线串起来:

镜头阴影校正(LSC)知识体系 镜头阴影现象 亮度阴影 颜色阴影 根因:光路衰减 LSC算法原理 多项式模型 网格模型 分通道处理 双线性插值 LSC标定流程 积分球均匀光源 增益计算与平滑 参数固化到OTP 量产逐模组标定 目标:中心到四角亮度差<5%,色差ΔE<3

4.5 避坑指南

做LSC这几年,我踩过的坑不少。挑几个典型的说说:

  • 标定光源不均匀:我曾经用普通灯箱做标定,结果灯箱本身就有阴影,标定出来的参数把灯箱的阴影也“校正”了。后来换了积分球才解决。
  • 忘记关其他ISP模块:标定时如果AWB或BLC开着,它们会干扰LSC的标定数据。记得所有模块都关掉,只留RAW输出。
  • 增益饱和:边缘像素增益太大,导致像素值溢出。解决办法是适当降低整体曝光,给边缘留出增益余量。
  • 温度漂移:sensor的暗电流随温度变化,会影响阴影特性。我建议在常温下标定一次,高温下再验证一次,确保参数在-20°C到60°C范围内都可用。
小技巧:量产时可以用“黄金模组”法——先标定一个标准模组,其他模组只做偏差校正。这样能大幅提升产线效率。

好了,LSC这块就聊到这儿。说白了,镜头阴影校正就是个“查漏补缺”的活——把镜头欠了每个像素的光,用增益补回去。算法不复杂,但标定细节多。你只要把均匀光源、增益计算、参数固化这三个环节把控好,基本不会出大问题。


专注资料整理