053、LSC镜头阴影校正:从理论模型到产线标定
053、LSC镜头阴影校正从理论模型到产线标定去年夏天我在产线蹲了三天就为了一个LSC问题。某款旗舰机的主摄边缘亮度比中心低了将近40%用户拍出来的照片像戴了墨镜。更诡异的是同样的模组换到另一家平台的ISP上阴影表现完全不同。产线工程师拿着标定数据来找我说“算法没问题是镜头不行”。我看了眼数据笑了——不是镜头不行是LSC模型和产线标定流程之间差了整整一个物理世界。阴影从哪里来镜头阴影学名叫“渐晕效应”。说白了就是光线从镜头中心到边缘走过的路径不一样长入射角度也不一样。中心区域光线直来直去边缘区域光线要斜着穿过多层镜片能量自然衰减。这还不算完CMOS传感器本身也有“角度响应”——像素对斜入射光的敏感度天生就低。两个效应叠加边缘亮度能掉30%-50%。手机镜头因为要做薄镜片组又小又密渐晕尤其严重。车载镜头为了大视场角边缘阴影更是家常便饭。医疗内窥镜那种鱼眼镜头阴影曲线能给你画个抛物线出来。理论模型别被公式骗了LSC校正的数学基础说穿了就是“乘一个增益”。对每个像素点(x,y)算出一个增益值G(x,y)把暗的地方乘亮亮的地方不动。理想情况下G(x,y)应该是镜头衰减函数的倒数。最经典的模型是“径向多项式模型”。假设镜头中心最亮亮度随半径r单调递减那么增益可以写成G® 1 a1r^2 a2r^4 a3*r^6 …注意这里只有偶次项。为什么因为镜头的光学特性是旋转对称的奇次项会破坏对称性。我见过有人把奇次项加进去结果校正完的照片一边亮一边暗像打了聚光灯。别这样写物理直觉比数学公式更重要。实际工程中4阶多项式a1和a2就够用了。6阶以上容易过拟合尤其是边缘像素少的时候高阶项会疯狂震荡。这里踩过坑某次量产我们用了8阶多项式标定数据完美拟合R²0.999。结果产线换了一批镜头边缘出现环形亮斑——高阶项把噪声也拟合进去了。更精确的模型是“网格增益表”。把图像分成16x16或32x32的网格每个网格存一个增益值像素之间双线性插值。这个模型不依赖任何物理假设能处理非对称阴影——比如镜头装配偏了或者传感器倾斜了。代价是标定数据量大存储开销高。产线标定理想和现实的差距实验室里你可以在暗室用均匀光源拍一张灰卡然后逐像素算增益。但产线上每一秒都是成本。标定时间超过3秒产线节拍就崩了。产线标定的核心矛盾是要快还要准。第一个坑光源均匀性。产线上的积分球标称均匀性99%实际边缘能差2%。这2%会被LSC校正“完美”地补偿掉——然后用户拍出来的照片中心比边缘暗2%。解决方案是先标定光源再标定镜头。或者用差分法拍两张不同位置的灰卡把光源不均匀性消掉。第二个坑镜头和传感器的配对。同一个镜头型号不同个体之间阴影曲线能差5%。同一个传感器不同批次的角度响应也不一样。所以产线必须“一对一”标定——每个模组单独算增益。有人想偷懒用“黄金模组”的标定数据批量复制结果边缘一致性一塌糊涂。别这样写代码除非你想被产线经理追杀。第三个坑温度漂移。镜头材料的热膨胀系数不是零温度变了镜片间距微变阴影曲线跟着变。车载影像尤其敏感夏天车内70度冬天零下30度同一个LSC参数效果天差地别。解决方案是做温度查表或者用自适应算法根据图像统计量实时调整增益。实战从标定到校正产线标定的标准流程是这样的第一步暗室环境积分球光源色温D65或者根据产品定义选其他色温。模组上电拍一张raw图。第二步提取亮度通道。注意不要用RGB的G通道代替亮度因为拜耳阵列的G像素只占一半直接取G会引入莫尔条纹。正确的做法是对raw图做简单的去马赛克或者用加权平均R:G:B0.2126:0.7152:0.0722。这里踩过坑某次偷懒直接用G通道结果校正完的照片绿色区域正常红色和蓝色区域阴影残留——因为R和B的衰减曲线和G不一样。第三步计算增益。对每个像素理想增益 中心亮度 / 当前亮度。但直接除会放大噪声尤其是边缘暗区信噪比本来就低增益一乘噪声跟着放大。所以要做平滑要么用多项式拟合要么用低通滤波。第四步压缩存储。增益值一般是浮点数但产线要烧录到模组的OTP里空间有限。通常用8bit或10bit定点数配合查表。注意量化误差——增益值差1个LSB在暗区可能造成1%的亮度误差肉眼可见。校正算法本身很简单读raw图查增益表逐像素乘。但性能优化有讲究。手机ISP里LSC通常放在BLC黑电平校正之后Demosaic之前。因为raw域的数据是线性的乘增益不会引入色偏。如果在RGB域做增益会改变白平衡需要额外补偿。调优经验那些年踩过的坑中心点不准径向模型依赖镜头中心坐标。产线上镜头装配有公差中心偏移几个像素校正效果就崩了。解决方案标定时自动检测中心或者用网格模型不依赖中心假设。边缘过曝增益值太大边缘像素乘完之后直接饱和。尤其是大光圈镜头边缘增益能到2.0以上。对策限制最大增益或者改用“减法校正”——先降中心亮度再统一提亮。代价是动态范围损失。色差耦合LSC只校正亮度但镜头阴影往往伴随色差——边缘的R和B衰减比例不同导致偏色。需要额外做“色阴影校正”CFA LSC对每个颜色通道独立算增益。产线标定失败最常见的原因是“灰卡没拍平”。灰卡有褶皱或者光源角度不对标定出来的增益曲线全是假的。产线质检要加一道“验证标定”的环节用标定参数校正另一张灰卡看残差是否在阈值内。个人建议别迷信理论模型。径向多项式在教科书上很漂亮但产线上网格增益表才是王道。它鲁棒、灵活、不依赖物理假设。代价是存储和计算但现在的ISP硬件16x16网格的查表插值一个时钟周期就搞定了。另外永远不要忽略“人眼感知”。LSC校正的目标不是“物理上均匀”而是“看起来均匀”。人眼对中心区域的亮度变化更敏感对边缘区域相对宽容。所以有些厂商会故意保留一点边缘暗角让照片更有“氛围感”。这不是偷懒是审美。最后产线标定不是一次性的。镜头老化、传感器衰减、环境变化都会让LSC参数失效。车载影像要求终身标定——每次OTA升级都要根据用户实际拍摄的数据微调增益表。这是算法工程师的终极噩梦也是系统架构师的终极挑战。下次产线再出LSC问题别急着骂镜头供应商。先看看你的标定流程是不是把物理世界简化成了数学公式。