第一章:镜头阴影校正(LSC)实战——亮度与色度阴影的成因、校正网格调试、边缘一致性优化

1.1 阴影现象:你拍的照片为什么中间亮、四周暗?

做ISP调试这么多年,我见过太多新人一上来就问:“为什么我拍的纯色画面,中间和四周颜色不一样?”

说白了,这就是镜头阴影。它分两种:

  • 亮度阴影(Luma Shading):画面中间亮、四周暗。像手电筒的光斑,中心最亮,边缘逐渐变暗。
  • 色度阴影(Color Shading):画面中间和四周颜色不一致。比如中间偏绿、四周偏红。这个更隐蔽,也更让人头疼。

为什么会这样?我简单解释一下:

镜头本身是个凸透镜,光线从中心通过时路径短、衰减少;从边缘通过时路径长、衰减多。再加上镜头模组的机械结构遮挡,边缘进光量自然就少了。这就是亮度阴影的根源。

色度阴影呢?更复杂一些。不同波长的光(红、绿、蓝)在镜头中的折射率不同。红光波长长,折射率小;蓝光波长短,折射率大。结果就是:蓝光更容易被边缘“吃掉”,导致画面四周偏红。我在项目中遇到过一款模组,边缘色差大到肉眼可见,用户直接投诉“照片像戴了有色眼镜”。

核心结论:亮度阴影是“量”的问题,色度阴影是“质”的问题。两者必须分开处理。

1.2 校正网格:LSC的核心武器

LSC校正,说白了就是给每个像素“补光”和“调色”。怎么补?靠一张校正网格(Gain Grid)。

网格是什么?你可以想象成一张覆盖在图像上的表格。每个格子对应一个区域,里面存着两个值:

  • 亮度增益(Luma Gain):用来补偿亮度衰减
  • 色度增益(Chroma Gain):用来补偿颜色偏移

网格的密度很关键。网格太稀疏,校正精度不够,画面会出现“块状”不均匀;网格太密,计算量大,而且容易过拟合。我个人习惯用 16x16 或 32x32 的网格,具体看 sensor 分辨率和镜头特性。

举个例子,假设你有一个 4000x3000 的 sensor,用 16x16 网格,每个格子覆盖 250x187.5 像素。校正时,ISP 会读取每个像素所在格子的增益值,然后做插值计算。

// 伪代码:LSC校正核心逻辑
for each pixel (x, y) in image:
    // 计算像素在网格中的位置
    grid_x = x / grid_width
    grid_y = y / grid_height
    
    // 双线性插值获取增益
    luma_gain = bilinear_interp(luma_grid, grid_x, grid_y)
    chroma_gain = bilinear_interp(chroma_grid, grid_x, grid_y)
    
    // 应用增益
    pixel.r = pixel.r * luma_gain * chroma_gain.r
    pixel.g = pixel.g * luma_gain * chroma_gain.g
    pixel.b = pixel.b * luma_gain * chroma_gain.b

嗯,这里要注意:插值算法选不好,校正后会出现“网格纹”。我踩过这个坑,后来改用双三次插值才解决。

1.3 调试流程:从采集到验证

调试LSC,我一般分四步走:

  1. 采集原始数据:用均匀光源拍灰卡或白墙。注意光源要均匀,色温要稳定。我建议用 D65 和 D50 两种光源分别采集,因为不同色温下色度阴影表现不同。
  2. 计算增益矩阵:把采集到的图像分成网格,计算每个网格的平均亮度值和 RGB 比值。然后和目标值(比如中心区域的亮度)对比,算出增益。
  3. 生成校正参数:把增益矩阵写入 ISP 的寄存器或 tuning 文件。不同平台格式不同,高通是 .xml,MTK 是 .bin,但原理一样。
  4. 验证效果:拍实景,看边缘和中心是否一致。我习惯用“十字线”和“纯色块”两种图卡来验证。

小技巧:采集数据时,镜头光圈要开到最大。因为光圈越小,阴影越不明显,校正参数会偏小,导致大光圈时校正不足。

1.4 边缘一致性优化:最难啃的骨头

校正完亮度阴影,你会发现色度阴影还在。或者校正完中心区域,边缘又过曝了。这就是边缘一致性优化的难点。

为什么难?因为镜头的光学特性不是线性的。边缘的衰减曲线和中心不同,而且不同波长光的衰减曲线也不同。你想想看,一个简单的增益矩阵怎么可能完美拟合这么复杂的曲线?

我的做法是:

  • 分段校正:把图像分成中心区、过渡区、边缘区,分别用不同的增益曲线。中心区用低增益,边缘区用高增益。
  • 色温自适应:不同色温下,色度阴影的表现不同。我建议在 AWB 模块中增加一个 LSC 参数切换逻辑,根据色温选择不同的校正网格。
  • 边缘平滑:校正后的边缘不能有“台阶感”。我会对增益矩阵做高斯平滑,让增益变化更自然。

避坑指南:我曾经在某个项目里,为了追求边缘亮度完全一致,把增益调得特别大。结果边缘噪点爆炸,暗部全是彩色噪点。后来我学乖了:LSC 校正要留有余量,边缘亮度可以比中心低 5%-10%,这样噪点可控,人眼也看不出来。

1.5 实战案例:一个典型的调试过程

我记得有一次,客户反馈一款前置摄像头拍人像时,人脸边缘发红。我拿到样机一看,典型的色度阴影问题。

排查过程:

  1. 先确认是镜头问题还是 sensor 问题。换一颗镜头,问题依旧,排除 sensor。
  2. 采集灰卡数据,发现 R/G 比值在边缘比中心高了 15%。
  3. 调整色度增益网格,把边缘的 R 通道增益降低 15%。
  4. 重新拍人像,边缘发红消失。

但问题没完。调整后,边缘亮度又偏暗了。原来色度增益和亮度增益是耦合的。我只好重新优化亮度网格,把边缘亮度增益提高 8%。

最终效果:边缘和中心的亮度差小于 3%,色差 ΔE 小于 2。客户满意了,我也松了口气。

1.6 知识体系图

下面这张图总结了 LSC 校正的核心逻辑,我画了很久,希望能帮你理清思路。

镜头阴影校正(LSC)知识体系 阴影成因 亮度阴影 + 色度阴影 校正核心 校正网格(Gain Grid) 调试流程 采集→计算→生成→验证 关键技术 • 双线性/双三次插值 • 分段校正 优化方向 • 边缘一致性 • 色温自适应 常见问题 • 网格纹 • 边缘噪点爆炸 最终目标:均匀亮度 + 一致色彩 边缘与中心亮度差 < 5%,色差 ΔE < 3 注:LSC 调试需要反复迭代,没有一次成功的

1.7 总结与建议

LSC 校正,说白了就是和镜头的光学缺陷做斗争。你永远无法完全消除阴影,但可以让它变得人眼不可见。

最后给几点建议:

  • 不要追求完美:边缘亮度比中心低 5% 以内,人眼基本看不出来。强行拉平反而会引入噪点。
  • 多光源验证:D65、D50、A 光源都要测。不同色温下色度阴影表现差异很大。
  • 关注实拍效果:实验室数据再漂亮,实拍翻车也是白搭。我每次调完 LSC,都会拿出去拍人、拍风景、拍夜景。

一句话总结:LSC 校正不是数学题,是艺术。你要在亮度、色彩、噪点之间找到平衡点。


公众号:蓝海资料掘金营,微信deep3321