我在文章手机中的计算摄影4-超广角畸变校正中介绍过,真实的镜头和理想的镜头不一样,理想镜头是满足薄透镜模型的:
然而,真实的镜头由多个透镜组合而成,即便已经做了精密的设计,镜头组也无法完全遵循薄透镜模型。导致的不完美结果很多,我们先看看镜头畸变。
径向畸变
在制造过程中,透镜的实际曲面和理想曲面之间存在一定的误差,这种误差会改变光的折射方向,使得成像点的位置发生偏差,通常这会导致“径向畸变”
根据透镜曲面的不同情况,径向畸变会导致画面出现桶形失真或枕形失真。
与此同时,实际相机通常采用多个透镜组成镜头组,各透镜中心与光轴是否重合、镜片与光轴是否垂直、各镜片沿光轴方向的位置偏差等都会使光线偏离理论路径。虽然透镜的组合可以相互抵消一些性质相反的非线性畸变,但是也会叠加一些性质相同的非线性畸变。通常,这会导致“切向畸变”
实际成像过程中,这两种畸变通常混杂在一起,尤其是广角镜头组很难避免它们。如下图所示:
下面这张图像是由我用Panasonic的DMC-LX5数码相机拍摄的,我们看到因为镜头的畸变,后方的门框出现了很明显的弯曲现象,这就是典型的桶形畸变:
在文章67. 三维重建——相机几何参数标定中,我介绍了畸变校正的原理,我们一般用下面的公式来进行畸变校正
这意味着如果要校正图像的畸变,就需要得到包括镜头畸变参数在内的相机内参。而工业界大多采用张正友标定法及其变种来进行相关参数的标定,这个过程需要我们拍摄许多张平面标定板来完成:
然而,在我们拿到一张需要进行后期处理的图像时,我们通常无法用拍摄这幅图像的相机去做上面的标定,比如这是一幅从网络下载的图像,或是别人拍摄的图像。那么,此时又该如何办呢?
我正在我的知识星球中介绍如何自动化的通过图像的EXIF数据获取到关于相机和镜头的关键信息,并利用这些关键信息进行畸变校正的方法。我们来看看畸变校正前后,图像的变化吧。你可以很明显的看到,通过我介绍的方法校正图像后,后面的门框变直了,且整个图像尽可能多的保留了信息:
那么,这是如何做到的呢?欢迎加入我的知识星球进行学习,事实上这是我正在编写的《Python图像后期处理与优化系列教程》中的一小部分内容,目前刚刚进行到去畸变这一部分。
我们之前已经学习了手写代码来完成raw文件解析的整个过程,我们建立的流程如下所示:
还学习了使用更强大的RawPy库来更方便的加载RAW格式图像,以便进行后期处理的方法。事实上,这个过程与相机ISP的操作流程非常相似,我们学习过程中挑选了最典型和重要的来讲解,可以认为我们完成了非常基础的ISP功能!