第一章:镜头阴影校正(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,我一般分四步走:
- 采集原始数据:用均匀光源拍灰卡或白墙。注意光源要均匀,色温要稳定。我建议用 D65 和 D50 两种光源分别采集,因为不同色温下色度阴影表现不同。
- 计算增益矩阵:把采集到的图像分成网格,计算每个网格的平均亮度值和 RGB 比值。然后和目标值(比如中心区域的亮度)对比,算出增益。
- 生成校正参数:把增益矩阵写入 ISP 的寄存器或 tuning 文件。不同平台格式不同,高通是 .xml,MTK 是 .bin,但原理一样。
- 验证效果:拍实景,看边缘和中心是否一致。我习惯用“十字线”和“纯色块”两种图卡来验证。
小技巧:采集数据时,镜头光圈要开到最大。因为光圈越小,阴影越不明显,校正参数会偏小,导致大光圈时校正不足。
1.4 边缘一致性优化:最难啃的骨头
校正完亮度阴影,你会发现色度阴影还在。或者校正完中心区域,边缘又过曝了。这就是边缘一致性优化的难点。
为什么难?因为镜头的光学特性不是线性的。边缘的衰减曲线和中心不同,而且不同波长光的衰减曲线也不同。你想想看,一个简单的增益矩阵怎么可能完美拟合这么复杂的曲线?
我的做法是:
- 分段校正:把图像分成中心区、过渡区、边缘区,分别用不同的增益曲线。中心区用低增益,边缘区用高增益。
- 色温自适应:不同色温下,色度阴影的表现不同。我建议在 AWB 模块中增加一个 LSC 参数切换逻辑,根据色温选择不同的校正网格。
- 边缘平滑:校正后的边缘不能有“台阶感”。我会对增益矩阵做高斯平滑,让增益变化更自然。
避坑指南:我曾经在某个项目里,为了追求边缘亮度完全一致,把增益调得特别大。结果边缘噪点爆炸,暗部全是彩色噪点。后来我学乖了:LSC 校正要留有余量,边缘亮度可以比中心低 5%-10%,这样噪点可控,人眼也看不出来。
1.5 实战案例:一个典型的调试过程
我记得有一次,客户反馈一款前置摄像头拍人像时,人脸边缘发红。我拿到样机一看,典型的色度阴影问题。
排查过程:
- 先确认是镜头问题还是 sensor 问题。换一颗镜头,问题依旧,排除 sensor。
- 采集灰卡数据,发现 R/G 比值在边缘比中心高了 15%。
- 调整色度增益网格,把边缘的 R 通道增益降低 15%。
- 重新拍人像,边缘发红消失。
但问题没完。调整后,边缘亮度又偏暗了。原来色度增益和亮度增益是耦合的。我只好重新优化亮度网格,把边缘亮度增益提高 8%。
最终效果:边缘和中心的亮度差小于 3%,色差 ΔE 小于 2。客户满意了,我也松了口气。
1.6 知识体系图
下面这张图总结了 LSC 校正的核心逻辑,我画了很久,希望能帮你理清思路。
1.7 总结与建议
LSC 校正,说白了就是和镜头的光学缺陷做斗争。你永远无法完全消除阴影,但可以让它变得人眼不可见。
最后给几点建议:
- 不要追求完美:边缘亮度比中心低 5% 以内,人眼基本看不出来。强行拉平反而会引入噪点。
- 多光源验证:D65、D50、A 光源都要测。不同色温下色度阴影表现差异很大。
- 关注实拍效果:实验室数据再漂亮,实拍翻车也是白搭。我每次调完 LSC,都会拿出去拍人、拍风景、拍夜景。
一句话总结:LSC 校正不是数学题,是艺术。你要在亮度、色彩、噪点之间找到平衡点。
公众号:蓝海资料掘金营,微信deep3321