镜头阴影校正原理:增益补偿模型与LSC算法概述

镜头阴影,说白了就是拍出来的照片四角发暗、中间亮。你想想看,用手机拍一张纯白墙壁,放大看四角是不是有点灰蒙蒙的?这就是镜头阴影在作怪。我刚开始接触ISP时,总觉得这问题不大,直到有一次做车载摄像头项目,客户拿测光表对着四角一量,差了好几个灰度级……嗯,从那以后我再也不敢小看LSC了。

为什么会有镜头阴影?

镜头阴影的成因主要有两个:

  • 光衰减(Cos⁴ Law):光线从镜头中心到边缘,入射角度越来越大,到达传感器的光强按cos⁴θ衰减。说白了,边缘收到的光比中心少得多。
  • 机械遮挡:镜头镜筒、滤光片支架等结构,会挡住一部分边缘光线。尤其是小光圈时,这种遮挡更明显。

这两种效应叠加,就形成了我们看到的亮度从中心到边缘逐渐下降的“阴影”。

增益补偿模型:最直观的思路

既然边缘暗,那就把边缘的信号放大呗。这就是增益补偿模型的核心思想——给每个像素乘一个系数,让四角亮起来。

数学上很简单:

I_out(x, y) = I_in(x, y) × Gain(x, y)

其中Gain(x, y)就是补偿增益,中心区域接近1.0,边缘区域可能到2.0甚至更高。我在一个安防项目中遇到过极端情况,边缘增益需要调到3.5倍才能和中心亮度一致——结果噪声也被放大了3.5倍,画面边缘全是噪点。所以LSC不是简单的乘法,还要考虑信噪比平衡。

LSC算法的两种主流实现

实际工程中,LSC算法主要分两大类:

类型 原理 存储开销 适用场景
网格式LSC 将图像分成M×N网格,每个网格顶点存一个增益值,中间像素插值 低(几十到几百字节) 手机、安防、车载等量产产品
多项式拟合LSC 用多项式曲面拟合增益分布,计算时直接代入坐标 极低(几个系数) 资源受限的嵌入式设备

我个人习惯用网格式LSC,因为它能更精细地适配不同镜头的阴影特性。多项式拟合虽然省资源,但遇到非对称阴影(比如镜头装歪了)就抓瞎了。

网格式LSC的工作流程

这里我画了一张流程图,帮你理清整个校正链路:

网格式LSC校正流程 原始RAW图像 加载网格增益表(M×N) 双线性插值计算逐点增益 像素级增益补偿 校正后RAW图像 💡 关键点: 网格越密,校正精度越高,但存储和计算开销也越大。量产时一般用 9×7 或 17×13 的网格。

双线性插值:让增益平滑过渡

网格顶点之间的像素怎么算?用双线性插值。我举个例子:

// 假设像素位于网格 (i, j) 到 (i+1, j+1) 之间
// dx, dy 是归一化偏移量(0~1)
G00 = gain_grid[i][j]
G10 = gain_grid[i+1][j]
G01 = gain_grid[i][j+1]
G11 = gain_grid[i+1][j+1]

// 先插值两行
G_top = G00 * (1 - dx) + G10 * dx
G_bot = G01 * (1 - dx) + G11 * dx

// 再插值列方向
G_pixel = G_top * (1 - dy) + G_bot * dy

这样算出来的增益是连续平滑的,不会出现块状痕迹。我曾经见过一个方案,直接用最近邻取整,结果校正后的照片上全是马赛克一样的网格线——嗯,这种坑踩过一次就不会再犯了。

增益上限与噪声控制

⚠️ 注意:增益不是越大越好!

边缘增益过高会放大暗部噪声。我建议设置一个增益上限(比如3.0倍),超过上限的区域用更保守的校正策略,或者配合后续的降噪模块一起处理。

实际项目中,我一般这样配置增益上限:

  • 手机摄像头:增益上限 2.0~2.5 倍(传感器信噪比好)
  • 安防监控:增益上限 2.5~3.0 倍(暗光场景多)
  • 车载摄像头:增益上限 1.8~2.2 倍(安全优先,避免噪声误判)

校准流程:如何生成增益表

增益表不是拍脑袋定的,得靠实际标定。标准流程如下:

  1. 拍摄均匀光源:用积分球或均匀白板,拍一张RAW图
  2. 计算参考值:取图像中心区域的平均亮度作为参考
  3. 逐网格计算增益:每个网格顶点的增益 = 参考亮度 / 该顶点亮度
  4. 平滑处理:对增益表做低通滤波,去除噪声和异常点
  5. 量化存储:将浮点增益转为定点数(比如Q8.8格式),写入设备

💡 我的经验:标定时一定要保证光源均匀性在99%以上。有一次我用普通灯箱标定,结果灯箱本身就有中心亮边缘暗的问题,LSC反而把均匀画面校正成了中心暗边缘亮——这笑话闹得可不小。

多项式拟合LSC:轻量级方案

如果存储空间实在紧张,可以用多项式拟合。常见的是二阶或三阶多项式:

Gain(x, y) = a0 + a1·r² + a2·r⁴ + a3·r⁶

其中 r = sqrt((x - cx)² + (y - cy)²) / R_max

只需要存4~6个系数,计算时直接代入坐标。但缺点也很明显——遇到非对称阴影就无能为力了。我建议只在低端MCU或FPGA资源紧张时用这种方案。

两种方案的对比总结

对比维度 网格式LSC 多项式拟合LSC
校正精度 高(可适配任意阴影形状) 中(仅适配对称阴影)
存储开销 中等(几百字节~几KB) 极低(几十字节)
计算复杂度 低(查表+插值) 中(多项式求值)
调试难度 低(可视化增益表) 高(系数调优靠经验)
量产适配 每颗镜头单独标定 同一型号共用系数

我个人更推荐网格式LSC,尤其是现在存储成本越来越低,多花几百字节换来的校正精度提升,值。

核心要点回顾:

  • 镜头阴影的本质是光衰减+机械遮挡,导致边缘亮度下降
  • 增益补偿模型通过给每个像素乘一个系数来校正亮度
  • 网格式LSC用双线性插值实现平滑校正,精度高、易调试
  • 多项式拟合LSC省存储,但只适合对称阴影场景
  • 增益上限和标定光源均匀性是工程落地的关键坑点