4、镜头阴影校正(LSC):从物理成因到高通Mesh实现
镜头阴影校正,圈里人常叫LSC。这玩意儿说简单也简单——把照片四周变暗的问题修回来。但说复杂,它涉及光学、传感器、甚至你的模组装配公差。
我个人习惯把LSC比作“给照片四角打补光灯”。你想想看,镜头本身是个凸透镜,光线从中心到边缘走过的路径不一样,能量衰减自然也不同。再加上传感器像素本身对斜入射光的响应差异,照片四周就暗下去了。
4.1 LSC的成因:不是镜头一个人的锅
很多人以为阴影全是镜头的问题。其实不然。我拆解一下,主要有三个因素在“合谋作案”:
- 镜头光学阴影(Lens Shading):这是主因。光线从镜头中心到边缘,遵循余弦四次方定律(cos⁴θ)。说白了,边缘光线入射角大,光通量就少。这是物理定律,改不了。
- 像素角度响应(Pixel Angular Response):传感器上的每个像素其实像个“小桶”,只对垂直入射的光最敏感。斜着来的光,有一部分会被像素间的金属遮光层挡住。这个效应在微透镜(Micro Lens)没对准时更明显。
- 模组装配公差:这个我踩过坑。镜头和传感器的相对位置哪怕偏了0.1mm,阴影分布就不再是完美的中心对称了。你校准出来的增益矩阵,换一台机器可能就不准。
核心结论:LSC校正的本质,就是给每个像素乘一个增益系数,把边缘的亮度“拉”回中心水平。但这个增益不是随便给的,得精确测量。
4.2 增益矩阵计算:从灰卡到校正表
怎么算这个增益?流程其实不复杂,但细节决定成败。
我记得第一次做LSC校准时,拿着灰卡拍了张均匀光照的图,结果发现中心亮度是200,边缘只有150。那增益就是200/150 ≈ 1.333。就这么简单?嗯,理想情况是这样。
实际计算要考虑几个问题:
- 采集均匀光源:用积分球或者均匀背光板。千万别在自然光下拍,天空本身就不均匀。
- 分通道计算:R、G、B通道的阴影程度不一样。因为硅对不同波长光的吸收深度不同,B通道通常衰减最厉害。所以你得算三个通道各自的增益矩阵。
- 归一化处理:以图像中心区域的平均值为基准。比如中心100x100块的均值是180,那每个像素的增益 = 180 / 该像素原始值。
- 平滑与裁剪:原始增益图可能有噪声,得做低通滤波。同时限制最大增益,我一般设到4.0倍,再大噪声就压不住了。
避坑指南:我曾经遇到过增益矩阵算出来边缘有1.8倍,结果校正后暗部噪声被放大了,整个画面像蒙了一层雪花。后来我加了增益上限和空间平滑,才把信噪比稳住。
4.3 高通LSC的Mesh网格实现
好了,理论讲完,咱们看看高通是怎么在硬件里干这活的。
高通ISP里,LSC用的是Mesh网格方式。什么意思?它不存每个像素的增益——那太费内存了。它存一个稀疏的网格点,比如17x13个点,均匀分布在图像上。每个网格点存一个增益值。中间像素的增益,靠双线性插值算出来。
我画个图帮你理解:
高通为什么用Mesh?两个原因:
- 节省存储:一个2000万像素的增益图,存成float32要80MB。Mesh网格只要17x13x4 ≈ 884字节。差距三个数量级。
- 硬件友好:双线性插值在硬件里就是几个乘加器的事,一个时钟周期就能算完一个像素。
Mesh的配置参数通常在高通QTI的Tuning工具里设置。你需要指定:
| 参数 | 说明 | 典型值 |
|---|---|---|
| mesh_h_size | 水平方向网格点数 | 17(对应16个区间) |
| mesh_v_size | 垂直方向网格点数 | 13(对应12个区间) |
| gain_table | 每个网格点的增益值(R/G/B三通道) | 1.0 ~ 4.0 |
| interp_mode | 插值模式 | bilinear(高通默认) |
4.4 校准流程:从实验室到产线
校准流程分两步:实验室标定和产线快速校准。
实验室标定(Golden Sample):
- 搭建积分球均匀光源,色温选D65(6500K)。
- 放上Golden模组,拍一张RAW图。
- 提取R、G、B三通道的亮度分布。
- 计算每个网格点的增益值,生成LSC表。
- 验证:用同一模组拍灰卡,检查四角亮度偏差是否在±2%以内。
产线快速校准:
产线不可能每台都拍积分球。高通的做法是:
- 用Golden模组生成一组“标准LSC表”。
- 产线上只拍一张均匀白板,快速验证阴影是否在公差内。
- 如果偏差大,微调增益表的整体偏移量(不重新计算每个点)。
注意:LSC校准必须和镜头模组绑定。换镜头型号、换传感器、甚至换镜头座,都得重新校准。我曾经见过一个项目,镜头供应商换了镀膜工艺没通知我们,结果LSC表全废了,四角偏红严重。从那以后,我要求每次镜头变更都必须重新送Golden样机。
4.5 高通LSC的硬件加速细节
最后聊点底层的。高通ISP里LSC模块的硬件实现,有几个关键点:
- 流水线设计:LSC在Bayer域处理,紧跟在BLC(黑电平校正)之后。因为黑电平没校准时,增益会放大黑电平误差。
- 增益精度:高通用Q8.8格式存增益,即8位整数+8位小数。精度1/256,够用了。我试过用Q4.4,结果出现条带(banding),后来改回Q8.8才解决。
- 边界处理:图像边缘的像素,可能落在网格之外。高通的做法是“clamp to edge”——用最近的网格点增益。这个处理不好会在边缘出现突变,我建议在Tuning时把网格稍微外扩一点。
嗯,LSC这块内容不少,但核心就三点:理解成因、算对增益、用好Mesh。你把这三点吃透了,镜头阴影就不再是问题。