2. 镜头阴影原理:光学渐晕与色彩阴影的成因、Lens Shading数学模型、高通平台LSC硬件模块

镜头阴影,说白了就是拍出来的照片四角发暗、中间亮。你拿手机对着白墙拍一张,如果四角明显比中心暗,那就是镜头阴影。我入行那会儿第一次调模组,看到raw图四角发紫,还以为是sensor坏了,折腾了两天才发现是镜头阴影没校正。

这一节我们就把镜头阴影的底裤扒干净。从物理成因到数学建模,再到高通硬件怎么处理,一条线讲透。

2.1 光学渐晕与色彩阴影的成因

镜头阴影分两种:亮度上的渐晕(Vignetting)和颜色上的色彩阴影(Color Shading)。它们经常同时出现,但根因不同。

2.1.1 光学渐晕(Luma Shading)

光学渐晕就是画面从中心到边缘亮度逐渐下降。原因有三个:

  • 几何衰减(cos⁴定律):镜头中心的光线垂直入射,边缘的光线斜着进来。斜入射的光通量按cos⁴θ衰减。θ是入射角,角度越大,衰减越狠。这是物理定律,改不了。
  • 镜头遮挡(机械渐晕):镜头筒、滤镜支架、光圈叶片在边缘处会物理遮挡一部分光线。这个跟镜头结构设计有关,换镜头或改结构可以缓解。
  • 像面照度不均匀:即使不考虑遮挡,镜头本身的透光率从中心到边缘也不是均匀的。镀膜工艺、镜片曲率都会影响。
我的一点经验: 量产模组里,机械渐晕往往是最大的坑。镜头组装时稍微偏一点,四角阴影就不对称。我曾经遇到一个项目,左半边比右半边暗了5%,查了两周才发现是镜头座注塑变形导致的。

2.1.2 色彩阴影(Color Shading)

色彩阴影比亮度渐晕更烦人。它表现为四角偏色——通常是偏绿或偏紫。为什么会这样?

  • 微透镜偏移:sensor每个像素上面有个微透镜,用来聚光。边缘像素的微透镜需要向中心偏移(Chief Ray Angle匹配)。如果偏移量不准,不同颜色通道的感光效率就不一样。Bayer阵列里G通道通常受影响最大。
  • 红外截止滤光片(IRCF)角度依赖:IRCF的透过率曲线随入射角变化。边缘光线斜着穿过IRCF,近红外波段被截止得更厉害,导致R通道衰减比B通道多,画面就偏蓝绿。
  • 镜头色差:不同波长的光在镜头里折射率不同。R和B光线在像面上的落点有微小偏移,造成边缘颜色分离。
注意: 色彩阴影在广角镜头上尤其严重。我调过一款120° FOV的模组,四角R通道增益需要拉到中心的2.3倍,B通道只要1.6倍。如果不做通道独立的校正,拍出来的天空四角直接变紫色。

2.2 Lens Shading数学模型

校正镜头阴影,本质上就是给每个像素乘一个增益系数。这个增益系数随像素位置变化,也随颜色通道变化。

2.2.1 增益模型

最常用的模型是多项式曲面拟合。假设图像中心为(0,0),像素坐标为(x,y),归一化半径为r:

r = sqrt(x² + y²) / R_max

Gain(r) = 1 + a₁·r² + a₂·r⁴ + a₃·r⁶

这里R_max是图像对角线的一半。a₁、a₂、a₃是拟合系数。为什么只用偶次项?因为镜头阴影是旋转对称的,奇次项会引入不对称。

对于色彩阴影,每个通道独立拟合:

Gain_R(r) = 1 + a_R1·r² + a_R2·r⁴ + a_R3·r⁶
Gain_Gr(r) = 1 + a_Gr1·r² + a_Gr2·r⁴ + a_Gr3·r⁶
Gain_Gb(r) = 1 + a_Gb1·r² + a_Gb2·r⁴ + a_Gb3·r⁶
Gain_B(r) = 1 + a_B1·r² + a_B2·r⁴ + a_B3·r⁶
关键点: Gr和Gb(Bayer阵列中同一行和不同行的G像素)在边缘的响应可能不同。高通平台允许Gr/Gb独立校正,这个后面会讲。

2.2.2 网格模型

多项式模型在极端广角下拟合精度不够。这时候用网格模型更靠谱:把图像分成M×N个网格,每个网格顶点存一个增益值,中间像素双线性插值。

模型类型 优点 缺点 适用场景
多项式(2阶/4阶/6阶) 参数少,存储小,硬件实现简单 广角镜头拟合误差大 FOV < 70° 的普通镜头
网格(9×9 / 17×17) 精度高,能处理不对称阴影 参数多,标定工作量翻倍 FOV > 70° 或双摄/多摄模组
混合模型 兼顾精度和存储 实现复杂,调试周期长 旗舰机主摄

我个人习惯:量产项目优先用网格模型。虽然标定麻烦一点,但鲁棒性好。多项式模型在实验室里拟合得很漂亮,一上产线,镜头批次波动就露馅了。

2.3 高通平台LSC硬件模块

高通的ISP里有一个专门的硬件模块叫LSC(Lens Shading Correction)。它在Bayer域处理,位置在BPC(坏点校正)之后、Demosaic之前。

2.3.1 硬件架构

LSC模块的核心是一个二维增益查找表(LUT)和双线性插值器。大致流程如下:

高通ISP LSC硬件模块数据流 Bayer Raw输入 增益LUT (4通道) 双线性插值器 像素级乘法器 校正后Bayer输出 控制寄存器(模式/增益限幅) LSC模块在Bayer域工作,R/Gr/Gb/B四个通道独立查表,增益上限通常限制在4.0x以内

2.3.2 关键寄存器与配置

高通LSC模块的配置项不少,我挑几个最关键的:

  • LSC_ENABLE:模块使能位。调试阶段建议先关掉,看原始阴影有多严重。
  • LSC_GAIN_TABLE:增益表基地址。网格模式下,这个表存的是每个网格顶点的增益值,按R/Gr/Gb/B顺序排列。
  • LSC_GAIN_MODE:0=多项式模式,1=网格模式。我建议量产一律用网格模式。
  • LSC_GAIN_CLIP:增益上限。默认4.0x,但广角镜头可能需要放宽到6.0x。注意:增益太大噪声也会被放大,四角噪点会炸。
  • LSC_GRID_SIZE:网格尺寸,常见配置9×9或17×17。网格越密,精度越高,但标定数据量也越大。
避坑指南: 我曾经在一个项目里把增益上限设到8.0x,结果四角暗部噪声飙到肉眼可见。后来加了增益限幅策略:增益超过4.0x的区域,强制用降噪模块拉一把。记住,LSC不是万能的,物理上欠曝的区域,硬拉只会出噪点。

2.3.3 高通平台的特殊处理

高通LSC模块有几个特色功能,值得单独说一下:

  • Gr/Gb独立校正:Bayer阵列里Gr和Gb的感光效率有差异,高通允许分别配置增益。这个在低照度下特别有用。
  • 双摄LSC同步:主摄和副摄的LSC参数可以独立加载,但高通提供了一个同步寄存器,保证双帧曝光时两路LSC同时生效,避免帧间闪烁。
  • 在线更新:LSC增益表可以在逐帧之间更新。变焦镜头或者多光圈场景下,可以动态切换LSC参数。
我的调试习惯: 拿到一个新模组,我会先拍一张DNP白板(均匀光源下),然后用高通Chitool导出raw图,在PC上算一遍理想增益曲面。把算出来的系数写进驱动,再拍一张验证。如果四角跟中心亮度差在2%以内,就算调好了。如果超过5%,我会检查镜头是否装歪了。

2.4 本章小结

镜头阴影校正,说难不难,说简单也不简单。物理成因就那几条,数学模型也就多项式或网格两种选择。但真正落地的时候,你会遇到各种奇葩问题:镜头批次波动、模组组装公差、IRCF镀膜一致性……

高通LSC硬件模块给了你足够的自由度——4通道独立增益、网格模式、在线更新。用好这些工具,再配合扎实的标定流程,镜头阴影就不是什么大问题。