镜头阴影校正(LSC)原理:亮度衰减模型、色彩阴影成因、增益补偿模型

镜头阴影,说白了就是拍出来的照片四角发暗、中间亮。你拿手机对着白墙拍一张,大概率能看到这个现象。做ISP的人,几乎天天跟它打交道。

我刚开始接触这个模块时,觉得不就是把四角提亮嘛,有什么难的?后来踩了不少坑才发现——亮度衰减只是表象,色彩阴影才是真正让人头疼的地方。

4.1 亮度衰减模型:为什么四角会变暗?

先聊聊物理原因。镜头阴影的亮度衰减,主要来自两个因素:

  • 光程差(Cos⁴ Law):光线从镜头中心到边缘,走过的路径更长,能量自然衰减。理想情况下,衰减量正比于 cos⁴(θ),θ 是入射角。
  • 机械遮挡(Vignetting):镜头筒、滤镜、光圈等机械结构,会遮挡一部分边缘光线。这个跟镜头设计强相关。

实际项目中,我很少直接用 cos⁴ 公式去算。为什么?因为镜头模组有公差,每颗镜头的衰减曲线都不一样。更常见的做法是——用均匀光源拍一张灰卡,然后反推出每个像素位置的衰减系数。

亮度衰减模型核心公式:

I_corrected(x, y) = I_raw(x, y) * gain(x, y)

其中 gain(x, y) = 1 / attenuation(x, y)

attenuation(x, y) 就是镜头在 (x, y) 位置的衰减比例,中心区域接近 1.0,边缘可能降到 0.3~0.6。

这里有个细节——衰减曲线通常不是圆对称的。你想想看,镜头模组在组装时,光轴不可能完美对准 sensor 中心。所以实际项目中,我们一般用二维网格(mesh grid)来存储增益值,而不是简单的径向公式。

4.2 色彩阴影成因:为什么边缘会偏色?

亮度衰减还算好理解,色彩阴影就有点绕了。我记得第一次在调试中看到画面边缘偏绿时,还以为是白平衡出了问题。查了半天才发现——是镜头阴影在作怪。

色彩阴影的成因主要有三个:

成因 说明 典型表现
微透镜偏移 sensor 上的微透镜(microlens)对边缘入射光收集效率下降,且不同颜色通道下降幅度不同 边缘偏绿或偏紫
IR-cut 滤光片角度依赖 滤光片的透过率随入射角变化,R/B 通道受影响更大 边缘偏蓝或偏红
镜头镀膜色散 不同波长光线在镜头边缘的折射率差异导致衰减不一致 边缘偏黄或偏紫

说白了,亮度衰减是「整体变暗」,色彩阴影是「不同颜色变暗的程度不一样」。这就麻烦了——你不能用一个统一的增益去补偿,得对 R、G、B 三个通道分别做校正。

我曾经踩过的坑: 只做亮度校正,不做色彩阴影校正。结果画面四角亮度是均匀了,但边缘偏绿的问题反而更明显了。因为亮度校正把绿色通道提得更亮了。

4.3 增益补偿模型:怎么算校正系数?

理解了衰减模型和色彩阴影成因,接下来就是怎么算增益了。增益补偿模型,说白了就是给每个像素乘一个系数,让边缘的亮度和色彩都回到正常水平。

实际工程中,增益补偿分两步走:

  1. 标定阶段:用均匀光源拍灰卡,计算每个像素位置的衰减比例
  2. 运行阶段:根据标定数据,对每个像素做增益补偿

标定阶段的数学表达如下:

// 假设在均匀光源下拍摄灰卡
// 取中心区域(比如图像中心 10% 区域)的平均值作为参考
ref_R = mean(R_center)
ref_G = mean(G_center)
ref_B = mean(B_center)

// 对每个像素位置 (x, y),计算增益
gain_R(x, y) = ref_R / R(x, y)
gain_G(x, y) = ref_G / G(x, y)
gain_B(x, y) = ref_B / B(x, y)

这里有个关键点——增益值不能无限大。如果某个像素位置衰减到只有中心亮度的 10%,增益就是 10 倍。但这样做会放大噪声。我一般会设置一个最大增益限制,比如 4.0 倍。超过这个值的区域,宁可保留一点暗角,也不能让噪声爆炸。

我的个人习惯: 标定完成后,一定要检查增益网格的平滑性。如果某个区域的增益突然跳变,说明标定数据有问题,或者镜头模组有瑕疵。平滑的增益曲线,才是好镜头。

4.4 增益网格与插值

实际项目中,我们不会为每个像素都存一个增益值——那样太占内存了。常见的做法是:

  • 存一个稀疏的增益网格,比如 16x16 或 32x32 的网格点
  • 运行时用双线性插值(bilinear interpolation)算出每个像素的增益

网格密度怎么选?我做过对比测试:

网格密度 内存占用(3通道,float) 校正精度 适用场景
8x8 768 bytes 一般 低端摄像头、实时性要求极高
16x16 3 KB 良好 主流手机、安防摄像头
32x32 12 KB 优秀 高端相机、专业设备
64x64 48 KB 极佳 实验室标定、特殊需求

我个人建议,量产项目用 16x16 就够了。32x32 的精度提升有限,但内存和计算量翻了好几倍。

4.5 本章知识体系

下面这张图,把镜头阴影校正的核心逻辑串起来了:

镜头阴影校正知识体系 镜头阴影校正(LSC)知识体系 镜头阴影校正 亮度衰减模型 色彩阴影成因 增益补偿模型 Cos⁴ Law 机械遮挡 微透镜偏移 IR-cut 角度依赖 标定阶段 运行阶段 增益网格 + 双线性插值 核心要点: • 亮度衰减 + 色彩阴影 = 完整镜头阴影 • 三通道独立增益,不能共用一套系数

4.6 实战中的避坑指南

最后,分享几个我在项目中踩过的坑:

坑1:标定光源不均匀

我曾经用了一个亮度不均匀的积分球做标定,结果校正后的画面反而出现了「甜甜圈」效应——中间暗、边缘亮。后来换了均匀性 < 1% 的光源才解决。

坑2:温度漂移

镜头阴影不是一成不变的。温度变化会导致镜头折射率改变,衰减曲线也会漂移。我建议在 -20°C 到 60°C 范围内做多组标定,运行时根据温度查表切换。

坑3:增益与噪声的平衡

边缘增益太大,噪声会被放大。我的经验是:增益超过 2.5 倍时,一定要配合降噪模块一起使用。否则画面边缘的噪点会让你怀疑人生。