镜头阴影校正(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 增益补偿模型:怎么算校正系数?
理解了衰减模型和色彩阴影成因,接下来就是怎么算增益了。增益补偿模型,说白了就是给每个像素乘一个系数,让边缘的亮度和色彩都回到正常水平。
实际工程中,增益补偿分两步走:
- 标定阶段:用均匀光源拍灰卡,计算每个像素位置的衰减比例
- 运行阶段:根据标定数据,对每个像素做增益补偿
标定阶段的数学表达如下:
// 假设在均匀光源下拍摄灰卡
// 取中心区域(比如图像中心 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 本章知识体系
下面这张图,把镜头阴影校正的核心逻辑串起来了:
4.6 实战中的避坑指南
最后,分享几个我在项目中踩过的坑:
坑1:标定光源不均匀
我曾经用了一个亮度不均匀的积分球做标定,结果校正后的画面反而出现了「甜甜圈」效应——中间暗、边缘亮。后来换了均匀性 < 1% 的光源才解决。
坑2:温度漂移
镜头阴影不是一成不变的。温度变化会导致镜头折射率改变,衰减曲线也会漂移。我建议在 -20°C 到 60°C 范围内做多组标定,运行时根据温度查表切换。
坑3:增益与噪声的平衡
边缘增益太大,噪声会被放大。我的经验是:增益超过 2.5 倍时,一定要配合降噪模块一起使用。否则画面边缘的噪点会让你怀疑人生。