我们经常比较头疼的是,图像的局部产生色偏,或者是某一个色调/亮度范围产生色偏。
比如说第六题所提到的:只有蓝天的颜色发生了明显的偏差。
造成局部偏差的原因有很多,比较常见的原因有两个:Lens shading和linearization。
因为相较于black level或者awb这些global的操作造成整体性的变化,shading correction 和linearization往往是只造成局部区域和某个intensity范围的偏差。这些问题往往更让难解决。
这一篇就重点说说lens shading:
Lens shading分为两个部分,luma shading correction,colour shading correction。
Chroma shading 如下图,RGB plane 没有重合。
correction之后:
可以看出RGB plane 重合了。
Luma shading就是所谓的vignetting,镜头的通光量从中心到边角减小,造成sensor的亮度响应从中心到边角的变小,图像看起来就是这样,中心亮,四周逐渐变暗。
3D视图:
这种信号强度的衰减呈现非常明显的中心对称特点,于是人们提出第一种shading 校正方法:
radial shading correct。
这种方法实现简单,针对shading对称性比较好的情况很有效,但是如果对于镜头装得倾斜了,或者存在局部不良的情况就不好用了。
如下图
很明显的衰减不对称,这样方法一就不好用了。于是有了方法2:
拍一张黑色的照片,再拍一张白色的照片,然后用如下公式:
由于响应衰减曲线不是线性的,而是近似cos4的衰减曲线,所以方法2需要对衰减曲线做一定的修正。但这种方法对于那种镜头衰减不能用一个简单函数表示的情况就不灵了。
于是后来就有了方法3:mesh shading correction。
mesh按照英文愿意就是网眼,渔网的那种格子。拍一张均匀亮度的图像,把图像分成n x m个格子,
每个格子的四个角都有一个校正系数,把这个nxm个格子的校正系数存起来,在运行期,根据每个像素的坐标,就知道这个像素落在哪个格子里,在格子内部,用cos4或者logN来模拟衰减曲线,就可以计算出每个像素的校正值。
现在大部分厂商都是采用的这种方法,它的缺点是需要存储比较多的校准数据,而且如果校准不准确的话,效果也就不会好。于是后来就有了方法4:automatic lens
shading correction。 也有人叫adaptive lens shading correction。反正就是不用校准,就能做lens shading correction。
看起来唯一的玄机就在这个所谓的LowPass filter里,有很多论文设计不同的filter,唯一的目的就是把数据分成受shading 影响的和不受shading影响的,不受shading影响的数据就是校正的target。也有专门的论文提供各种比较结果。现在已经有不少公司提供这种不用校准的lens shading correction方案,效果确实非常不错。