4. 镜头阴影校正(LSC):亮度与色度阴影成因、校正算法、调试技巧

镜头阴影校正,圈里人常叫它 LSC(Lens Shading Correction)。

说白了,就是解决照片四周发暗、发绿或者发红的问题。你想想看,明明拍的是白墙,结果四角比中心暗了一截,甚至偏色——这就是镜头阴影在作怪。

我刚开始调 ISP 那几年,最头疼的就是这个模块。因为它不像坏点校正那样“坏了就修”,LSC 的校正量是随镜头、光圈、焦距、色温都在变的。调不好,画面就“脏”了。

4.1 阴影是怎么来的?

镜头阴影分两种:亮度阴影和色度阴影。成因完全不同,但经常一起出现。

4.1.1 亮度阴影(Luma Shading)

也叫“光晕衰减”。核心原因就一个:镜头的光学设计不是完美的。

  • 余弦四次方定律:光线从中心到边缘,入射角变大,传感器接收到的光强按 cos⁴θ 衰减。边缘可能只有中心 50% 甚至更低的亮度。
  • 镜头遮挡:尤其是广角镜头,镜筒本身会遮挡一部分边缘光线。
  • 微透镜效率:传感器每个像素上面有个微透镜,边缘光线打上去,收集效率也会下降。

我在项目中遇到过一款手机镜头,FOV 做到 120°,结果边缘亮度掉到中心的 30%。不校正根本没法看。

4.1.2 色度阴影(Color Shading)

这个更隐蔽。亮度阴影只是变暗,色度阴影是偏色。

  • IR 滤光片角度依赖:光线斜着穿过 IR 滤光片,不同波长的透过率不一样。边缘的红色和蓝色通道比例会失衡。
  • 微透镜与像素串扰:斜入射光容易串到相邻像素,尤其是 R 和 B 通道受影响程度不同。
  • 镜头镀膜:不同波长的光在镜片镀膜上的反射率不同,边缘色偏更明显。

我记得有一次调一个安防摄像头,白天画面正常,一到晚上红外补光,四角全变成紫红色。查了两天才定位到是 IR 滤光片和镜头的匹配问题。

关键认知:亮度阴影是“量”的问题,色度阴影是“质”的问题。校正策略完全不同。

4.2 校正算法:怎么把阴影拉回来?

校正思路其实很直接:测出每个像素位置的衰减量,然后乘上一个增益把它补回来。

但怎么测、怎么存、怎么算,这里面有讲究。

4.2.1 增益矩阵法(Gain Map)

这是最主流的方法。把图像分成网格,每个网格存一个增益值。

  • 网格大小:常见 16x16、32x32 或 64x64。网格越细,校正越精准,但存储开销也大。
  • 插值方式:像素落在网格之间,用双线性插值算出它的增益。
  • 分通道:R、Gr、Gb、B 四个通道分别存增益矩阵。因为色度阴影需要独立校正。
// 伪代码:LSC 校正核心逻辑
for each pixel (x, y) {
    // 根据网格坐标查表
    grid_x = x / grid_width;
    grid_y = y / grid_height;
    
    // 双线性插值计算增益
    gain = bilinear_interp(gain_table[channel], grid_x, grid_y);
    
    // 校正
    pixel_out[channel] = pixel_in[channel] * gain;
}

4.2.2 多项式拟合法

用多项式曲面来拟合阴影曲线。优点是存储量小,缺点是拟合精度有限。

  • 常用模型:二阶或四阶多项式。中心对称的镜头用径向多项式就够了。
  • 适用场景:低端芯片、存储受限的嵌入式设备。

我个人习惯,能用增益矩阵就不用多项式。因为实际镜头的阴影分布往往不是完美的对称曲面,多项式拟合容易在边缘留下“翘起”的残留。

4.2.3 自适应校正

这是高阶玩法。根据图像内容动态调整校正强度。

  • 亮度自适应:暗光场景下,增益太大会放大噪声。需要做增益上限钳位。
  • 色温自适应:不同色温下,色度阴影的形态会变。需要多组 LSC 参数切换。

调试技巧:我建议在实验室至少采集 3 个色温(D65、A 光源、TL84)下的 LSC 参数。实际产品中,色温变化对色度阴影的影响比很多人想象的大。

4.3 调试流程:从灰卡到实景

LSC 调试,说白了就是“拍灰卡、算增益、验证、微调”的循环。

  1. 准备灰卡:均匀的 18% 灰卡或白卡。卡面要平整,光照要均匀。
  2. 采集 raw 图:在积分球或均匀光源下拍摄。光圈、焦距、变焦位置都要覆盖。
  3. 计算增益矩阵:以图像中心为参考,计算每个网格的 R/Gr/Gb/B 增益。
  4. 写入参数:把增益表烧录到 sensor 模组的 OTP 或 flash 里。
  5. 验证:拍灰卡看均匀性,拍实景看自然度。

我曾经踩过一个坑:在实验室用积分球调好的 LSC,拿到户外拍蓝天,四角发紫。后来发现是积分球的光谱和自然光不一样,导致色度阴影参数偏差。从那以后,我坚持在实验室调完,必须到户外实景验证一遍。

注意:LSC 参数和镜头模组是一一对应的。换一颗镜头,哪怕同型号,也要重新标定。不要偷懒复用参数。

4.4 调试技巧与避坑指南

调了这么多年 LSC,我总结了几条实用的经验。

4.4.1 增益上限要设死

边缘增益太大,会把噪声也放大。尤其是暗光场景,边缘的噪点会非常明显。

  • 建议上限:增益不超过 2.0x(即 6dB)。超过这个值,优先考虑换镜头或加光。
  • 平滑过渡:增益曲线不要有陡变,否则会出现“光环”效应。

4.4.2 色度阴影要分通道看

不要只看亮度均匀性。把 R/Gr、B/Gr 的比值画出来,才能发现色度阴影。

  • 理想值:R/Gr 和 B/Gr 在全画面波动 < 1% 。
  • 常见问题:边缘 R/Gr 偏高,画面偏红;B/Gr 偏低,画面偏黄。

4.4.3 注意“十字线”效应

网格增益法在网格边界处如果插值不够平滑,会出现十字线或网格纹。

  • 解决方法:增加网格密度,或者用更高阶的插值算法。
  • 检查方法:拍一张均匀灰卡,用伪色显示增益残差。

4.4.4 变焦镜头要分段标定

变焦镜头的阴影随焦距变化很大。我建议在广角端、中焦端、长焦端分别标定 LSC 参数。

  • 切换策略:根据镜头反馈的 zoom 位置,线性插值切换 LSC 参数。
  • 注意:变焦过程中,阴影变化不是线性的。需要多采几个点。

我的习惯:每次调完 LSC,我都会拍一张“白墙+蓝天+人脸”的实景图。白墙看均匀性,蓝天看色度阴影,人脸看自然度。三张图过不了,参数就不算调完。

4.5 知识结构:LSC 调优全景图

下面这张图,是我自己整理 LSC 调优时用的框架。从成因到算法,再到调试验证,一条线串起来。

镜头阴影校正(LSC)调优全景图 成因分析 亮度阴影 色度阴影 校正算法 增益矩阵 多项式拟合 调试验证 灰卡 + 实景 关键参数与指标 网格密度(16x16~64x64) 增益上限(≤2.0x) R/Gr、B/Gr 波动 <1% 色温自适应(3组) 常见问题与避坑 边缘噪声放大 十字线/网格纹 变焦阴影突变 模组一致性 💡 核心原则 1. 亮度阴影靠增益补,色度阴影靠分通道调。 2. 实验室调完必须实景验证,尤其是色温变化场景。 3. 增益不是越大越好,噪声和阴影之间要找平衡。

4.6 总结

镜头阴影校正,说难不难,说简单也不简单。

难在它和镜头、sensor、模组、色温、变焦都有关系,变量太多。简单在原理清晰、流程固定,只要按步骤来,总能调好。

我个人觉得,LSC 调优最考验的是耐心。一遍不行就两遍,两遍不行就换方法。别指望一次搞定。

嗯,这一章就到这里。记住:均匀性是基础,自然度是目标,噪声是底线。