4、镜头阴影校正:从余弦四次方到增益矩阵

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

这玩意儿说白了,就是解决照片四周发暗的问题。你拿手机拍张白墙,如果四角比中心暗,那就是镜头阴影在作怪。我刚开始做ISP时,第一版算法跑出来,画面四周黑得像戴了墨镜,被测试同事笑了好久。

4.1 阴影成因:余弦四次方定律

为什么会四周发暗?

核心原因就一个——余弦四次方定律。这个定律说,像面照度与入射角余弦的四次方成正比。

公式长这样:

E = E₀ · cos⁴(θ)

其中:

  • E₀:中心照度
  • θ:光线与光轴的夹角

你想想看,镜头边缘的光线,入射角大,cos值小,四次方之后衰减更明显。再加上镜头本身的渐晕效应,暗角就出来了。

实际影响有多大?

以1200万像素传感器为例,四角照度可能只有中心的40%~60%。

不校正的话,画面边缘的SNR会明显下降,噪点也跟着冒出来。

我在项目中遇到过一种特殊情况——广角镜头。它的cos⁴衰减特别严重,四角照度甚至掉到30%以下。那时候我才意识到,光靠镜头设计是压不住的,必须上算法。

4.2 LSC校正原理

校正思路其实很直接:

  1. 测量:拍一张均匀亮度的画面(比如白板),得到每个像素的响应值
  2. 计算增益:用中心亮度除以每个像素的亮度,得到增益系数
  3. 应用:把增益乘到原始像素上,补偿暗角

公式表达:

I_corrected(x,y) = I_raw(x,y) × Gain(x,y)

嗯,这里要注意——增益不能无限大。我曾经见过有人把四角增益拉到4倍以上,结果暗角没了,但噪声被放得惨不忍睹。一般建议增益上限控制在2.5~3.0倍。

我的经验:

增益矩阵最好做平滑处理。直接逐像素算出来的增益,往往带有噪声,校正后反而引入条纹。我习惯先做一次高斯滤波,再生成增益表。

4.3 标定板采集流程

标定板采集,看着简单,坑却不少。我整理了一套标准流程:

步骤 操作 注意事项
1 准备均匀白板 建议用DNP或X-Rite标准白板,不要用普通白纸
2 固定相机与光源 光源用积分球或双灯箱,保证照度均匀度>95%
3 设置相机参数 固定增益、曝光时间、光圈,关闭自动功能
4 采集多帧图像 至少16帧,取平均消除随机噪声
5 检查数据有效性 中心区域亮度不能饱和(建议80%满阱)

避坑指南:

我曾经在产线上遇到过一批标定板,表面有肉眼看不见的微小划痕。采集出来的增益矩阵,对应位置出现异常亮点。后来我加了一步——用中值滤波检测异常点,超过3σ的直接剔除并插值替换。

4.4 增益矩阵生成与插值

增益矩阵的生成,核心是网格化。我们不会为每个像素单独存增益,那样太占内存。通常的做法是:

  1. 将图像分成M×N个网格(比如17×13)
  2. 在每个网格中心计算一个增益值
  3. 存储为稀疏矩阵
  4. 运行时通过插值得到每个像素的增益

插值方法我推荐两种:

  • 双线性插值:速度快,适合实时处理
  • 双三次插值:平滑性好,适合高精度场景

代码示例(双线性插值核心逻辑):

// 假设gain_table是17x13的网格
// x_ratio, y_ratio是当前像素在网格内的归一化位置

float g00 = gain_table[row][col];
float g10 = gain_table[row][col+1];
float g01 = gain_table[row+1][col];
float g11 = gain_table[row+1][col+1];

float g0 = g00 * (1 - x_ratio) + g10 * x_ratio;
float g1 = g01 * (1 - x_ratio) + g11 * x_ratio;
float gain = g0 * (1 - y_ratio) + g1 * y_ratio;

性能优化建议:

实际工程中,我会把插值系数提前算好,存成查找表。这样每个像素只需要两次乘加,比实时算浮点快3~5倍。

还有一个细节——通道独立。R、G、B三个通道的阴影程度不一样,必须分别生成增益矩阵。我见过有人偷懒只算一个通道,然后统一乘,结果画面出现彩色暗角,那叫一个难看。

知识体系总览

下面这张图,把本章的核心逻辑串起来了:

镜头阴影校正知识体系 成因 余弦四次方定律 校正原理 测量 → 计算增益 → 应用 标定流程 白板 → 采集 → 检查 增益矩阵生成 网格化 → 稀疏存储 → 插值 双线性插值 速度快,实时处理 双三次插值 平滑好,高精度 通道独立 R/G/B分别处理

从成因到实现,每一步都有坑。但只要你把标定流程走扎实,增益矩阵算准确,LSC的效果立竿见影。我调试过的项目中,校正后四角亮度差能从40%压到5%以内,肉眼基本看不出来。

最后说一句:

别迷信算法能解决一切。镜头本身的品质、光源的均匀度、标定板的精度,这些硬件因素决定了LSC的天花板。算法只是在硬件基础上做到最好。

专注资料整理