3、镜头阴影校正:LSC原理、网格标定方法、参数优化策略
镜头阴影校正,英文叫Lens Shading Correction,简称LSC。说白了,就是解决照片四周发暗、发偏色的问题。
你想想看,用手机拍一张纯白墙壁的照片,放大看中间是白的,但四个角可能变暗了,甚至带点绿或者带点紫。这就是镜头阴影。我刚开始做ISP调试时,第一次看到这个现象还以为是传感器坏了,后来才知道——这是物理规律,每个镜头都有。
3.1 阴影是怎么来的?
镜头阴影主要分两种:亮度阴影和颜色阴影。
亮度阴影,也叫Luma Shading。原因是镜头是个凸透镜,光线从中心到边缘的路径不一样。中心光线直来直去,边缘光线要斜着走,光能量自然就衰减了。再加上镜头本身有机械结构,边缘可能被遮挡一部分。结果就是:中心亮,四周暗。
颜色阴影,也叫Color Shading。这个更麻烦。不同波长的光通过镜头时,折射角度不一样。红光和蓝光在传感器边缘的落点位置有偏差,导致边缘的颜色比例失衡。我在项目中遇到过一款广角镜头,拍出来的照片四角偏紫红色,怎么调白平衡都没用——后来发现是Color Shading在作怪。
核心结论:亮度阴影影响亮度均匀性,颜色阴影影响色彩一致性。两者都需要校正。
3.2 LSC的原理:乘一个增益就完事?
校正原理其实不复杂。既然边缘暗了,那就在边缘区域把像素值乘上一个大于1的系数,把亮度拉回来。中心区域保持不变,或者乘一个接近1的系数。
数学表达很简单:
I_corrected(x, y) = I_raw(x, y) × Gain(x, y)
其中Gain(x, y)就是每个像素位置对应的增益值。这个增益值不是随便给的,需要根据实际测量结果来算。
嗯,这里要注意:增益不能太大。如果边缘增益超过4倍,噪声会被放大到不可接受的程度。我曾经调试过一颗低成本镜头,边缘亮度掉到只有中心的20%,强行拉回来之后,边缘的噪点简直没法看。所以LSC不是万能的,镜头本身的光学设计也很重要。
3.3 网格标定方法:怎么拿到增益数据?
要得到准确的增益值,需要做标定。常用的方法是拍一张均匀亮度的灰卡或者用积分球光源。我个人习惯用DNP灯箱,亮度均匀性要求至少98%以上。
标定流程大致如下:
- 准备均匀光源:积分球或者灯箱,保证整个画面亮度一致
- 拍摄RAW图:关闭所有ISP处理,直接输出RAW数据
- 分块统计:把图像分成M×N个网格,比如16×16或者32×32
- 计算每个网格的平均值:以中心网格为参考,计算其他网格的增益
- 生成LUT:把增益值存成查找表,供ISP运行时使用
举个例子,假设图像分成16×16网格:
// 伪代码示意
for each grid (i, j):
avg_val = average_pixel(grid[i][j])
ref_val = average_pixel(center_grid)
gain[i][j] = ref_val / avg_val
// 保存为LUT
LUT[i][j] = gain[i][j]
这里有个坑:网格数量不能太少,否则校正后会出现明显的块状效应。也不能太多,否则存储和计算开销太大。我一般建议用16×16或者32×32,具体看芯片能力。
我的经验:标定时最好拍三张不同亮度的灰卡(比如18%灰、50%灰、90%灰),取平均值。这样可以减少随机噪声的影响。我曾经只拍一张就拿来用,结果校正后的照片有轻微的条纹噪声,排查了半天才发现是标定数据不够稳定。
3.4 参数优化策略:让校正更自然
拿到标定数据后,直接套用往往效果不好。需要做一些优化。
策略一:平滑处理
标定出来的增益值可能有噪声,直接使用会导致校正后的图像出现纹理异常。我习惯对增益矩阵做一次高斯平滑,或者用双线性插值把离散的网格点变成连续的曲面。
// 双线性插值示例
function interpolate_gain(x, y, gain_grid):
// 找到最近的四个网格点
// 按距离加权平均
return weighted_average
策略二:分通道处理
R、G、B三个通道的阴影特性不同,需要分别标定和校正。特别是Color Shading,需要单独计算R/G和B/G的比例。
| 通道 | 典型阴影特性 | 校正方式 |
|---|---|---|
| R | 边缘衰减较快 | 增益较大 |
| G | 居中 | 增益适中 |
| B | 边缘衰减较慢 | 增益较小 |
策略三:亮度自适应
不同亮度场景下,阴影的表现不一样。暗光下阴影更明显,因为噪声占比大。我建议做多组LUT,根据环境亮度切换。比如分三档:低照度、正常照度、高照度。
避坑指南:我曾经在调试一款安防摄像头时,发现LSC在白天效果很好,但到了晚上画面边缘全是噪点。原因是暗光下增益被放大了,噪声也跟着放大。后来加了亮度自适应策略,暗光时降低增益上限,配合降噪算法一起处理,问题才解决。
策略四:温度补偿
这个容易被忽略。镜头和传感器的特性会随温度变化,阴影曲线也会漂移。我建议在-20°C、25°C、60°C三个温度点分别做标定,然后做线性插值。虽然工作量大了点,但效果确实好。
3.5 调试中的常见问题
- 校正过度:边缘出现亮斑。原因是增益给大了,或者标定用的光源不均匀。检查光源均匀性,重新标定。
- 校正不足:边缘还是暗。可能是网格太粗,或者增益上限设得太低。适当增加网格密度,提高增益上限。
- 颜色不一致:校正后边缘偏色。检查Color Shading的R/G、B/G比例是否准确,可能需要单独做颜色阴影标定。
- 实时性能问题:LSC计算量太大,帧率下降。优化插值算法,或者用查表法代替实时计算。
嗯,最后说一句。LSC调试是个细致活,没有捷径。我见过有人想偷懒,直接用默认参数,结果拍出来的照片总是不对劲。老老实实做标定、调参数,效果才能上去。你想想看,用户拿到手机拍第一张照片,如果发现四角发暗,第一印象就差了。所以这块值得花时间。