镜头阴影校正 LSC

镜头阴影有两种表现形式,分别是

  • Luma shading,又称 vignetting,指由于镜头通光量从中心向边缘逐渐衰减导致画面边缘亮度变暗的现象。
  • Chroma shading,指由于镜头对不同波长的光线折射率不同引起焦平面位置分离导致图像出现伪彩的现象。

Vignetting 原理

画面边缘镜头能量衰减:

如上图所示,由于镜头中都会存在多处光阑,当入射光线偏离光轴角度较大时,部分光线就会被光阑遮挡而不能参与成像,因此越靠近 sensor 边缘的像素接收到的曝光量就越低。

边缘像素微透镜和感光面的错位:

这个问题在手机 sensor 上通常会更严重一些,因此设计手机 sensor 的厂家会采取一些特定的方法去缓解这个问题。一种常用的方法是在微透镜上做文章,即从中心像素开始,微透镜的尺寸略小于感光面的面积一点点,这样越往边缘微透镜与感光面之间的错位就越大,刚好可以补偿入射光线角度增大导致的焦点偏移,使光线可以更好地聚焦到感光面上,如下图所示。

不过深入研究会发现,这个补偿办法其实也是有局限的,如果 sensor 采用的是下图左所示的 FSI 工艺(前照式),从像素微观结构来看,当入射光线角度比较大时,会有较多光线与像素中的金属布线层发生吸收、散射从而产生损失,单纯移动微透镜的位置并不能有效解决这个问题。但是,如果像素采用的是右图所示的 BSI 工艺(背照式),因为布线层在硅片的另外一侧,所以光线损失会少,补偿效果更加有效。

Vigetting 是由镜头引起的现象,所以 LSC 校正也是针对特定镜头的。若果产品的适配镜头发生变化,原则上需要重新进行 LSC 校正。

另外,Vigetting 现象在 sensor 靶面较大、镜头焦距较短时表现更加明显。采用非球面镜头通常可以改善 vignetting。

Chroma shading 原理

镜头对不同波长的光线折射率不同会导致色差问题,即不同波长的焦点在空间上不重合,导致焦平面分裂为三个不完全重合的曲面,这会破坏图像的白平衡,使图像出现伪彩,如下图所示。根据 sensor 所处的前后位置不同,伪彩可能偏红也可能偏蓝。

Chroma shading 一般主要通过镜头选型来控制其影响。如果 ISP 支持 chroma shading 校正,则可以通过标定三个颜色平面的增益来修正。为了控制标定表格的存储空间,通常只标定 MxN 个关键点,任意位置处的像素增益可以使用相邻四个标定关键点通过双线性插值的方法动态计算得到。在一个典型的 ISP 实现中,可以取 M=N=17 即可得到令人满意的效果。

矫正方法

LSC 的本值就是能量有衰减,反过来为了矫正就用该点的像素值乘以一个 gain 值,让其恢复到衰减前的状态,所以矫正的本质就是找到这个 gain 值。

从目前的矫正方法来看个人觉得可以分成三大类:

  • 储存增益法。
  • 多项式拟合法。
  • 自动矫正法。

目前方法 1 和方法 2 是使用最多的。

储存增益法

radial shading correct

上面有提到衰减符合 cos(θ) 的四次方规律,而θ在三维空间对各个方向是一致的,所以各个方向的衰减如下图

图中相同颜色可以理解成亮度是一样的,也就是图中红色一圈圈的像素需要的增益是一样的,所以就可以用半径为变量来求出不同半径像素需要的增益。然后把半径对应的增益值储存在内存中,到了要用的时候再拿出来用,从而完成矫正。但是不可能把所有像素的半径都存储起来,所以就通过采样的方式提取特征半径的增益存储到内存,然后其他半径对应的增益在矫正的时候通过插值算法求出来。这种方式对内存的硬件要求就低了。这就是 radial shading correct。

mesh shading correct

和半径不同,这种方式是把整幅图像分成 n*n 个网格,然后针对网格顶点求出矫正的增益,然后把这些顶点的增益储存到内存中,同理其他的点的增益也是通过插值的方式求出。

如图是上图分成网格后,每个网格亮度的分布,可以看出和 cos(θ) 的四次方很接近,然后针对这样的网格亮度求出增益如下图,刚好和亮度分布相反

多项式拟合

多项式拟合的方式就是用半径为采样点,然后把这些采样点通过高次拟合的方式拟合成一个高次曲线,然后把高次曲线的参数储存起来,用的时候把半径带入公式就能求出对应的 gain 值用于矫正。

参考文献

https://zhuanlan.zhihu.com/p/98820927
https://zhuanlan.zhihu.com/p/389334269