Py学习  »  Python

无法做标定,如何用Python自动进行相机图像的畸变校正?

计算机视觉life • 1 年前 • 285 次点击  
点击上方“计算机视觉life”,选择“星标”

快速获得最新干货

文章转载HawkWang

我在文章手机中的计算摄影4-超广角畸变校正中介绍过,真实的镜头和理想的镜头不一样,理想镜头是满足薄透镜模型的:

然而,真实的镜头由多个透镜组合而成,即便已经做了精密的设计,镜头组也无法完全遵循薄透镜模型。导致的不完美结果很多,我们先看看镜头畸变。


径向畸变


在制造过程中,透镜的实际曲面和理想曲面之间存在一定的误差,这种误差会改变光的折射方向,使得成像点的位置发生偏差,通常这会导致“径向畸变”


 



根据透镜曲面的不同情况,径向畸变会导致画面出现桶形失真或枕形失真。 



与此同时,实际相机通常采用多个透镜组成镜头组,各透镜中心与光轴是否重合、镜片与光轴是否垂直、各镜片沿光轴方向的位置偏差等都会使光线偏离理论路径。虽然透镜的组合可以相互抵消一些性质相反的非线性畸变,但是也会叠加一些性质相同的非线性畸变。通常,这会导致“切向畸变”


实际成像过程中,这两种畸变通常混杂在一起,尤其是广角镜头组很难避免它们。如下图所示:



下面这张图像是由我用Panasonic的DMC-LX5数码相机拍摄的,我们看到因为镜头的畸变,后方的门框出现了很明显的弯曲现象,这就是典型的桶形畸变:




在文章67. 三维重建——相机几何参数标定中,我介绍了畸变校正的原理,我们一般用下面的公式来进行畸变校正


这意味着如果要校正图像的畸变,就需要得到包括镜头畸变参数在内的相机内参。工业界大多采用张正友标定法及其变种来进行相关参数的标定,这个过程需要我们拍摄许多张平面标定板来完成:


然而,在我们拿到一张需要进行后期处理的图像时,我们通常无法用拍摄这幅图像的相机去做上面的标定,比如这是一幅从网络下载的图像,或是别人拍摄的图像。那么,此时又该如何办呢?


我正在我的知识星球中介绍如何自动化的通过图像的EXIF数据获取到关于相机和镜头的关键信息,并利用这些关键信息进行畸变校正的方法。我们来看看畸变校正前后,图像的变化吧。你可以很明显的看到,通过我介绍的方法校正图像后,后面的门框变直了,且整个图像尽可能多的保留了信息:


那么,这是如何做到的呢?欢迎加入我的知识星球进行学习,事实上这是我正在编写的《Python图像后期处理与优化系列教程》中的一小部分内容,目前刚刚进行到去畸变这一部分。



我们之前已经学习了手写代码来完成raw文件解析的整个过程,我们建立的流程如下所示:

还学习了使用更强大的RawPy库来更方便的加载RAW格式图像,以便进行后期处理的方法。事实上,这个过程与相机ISP的操作流程非常相似,我们学习过程中挑选了最典型和重要的来讲解,可以认为我们完成了非常基础的ISP功能!

本文仅用于学术分享,如有侵权联系删除

我是小六,中科院博士毕业,计算机视觉life平台创始人。前CV算法工程师,现在从事机器人SLAM方/三维视觉方向媒体、职业教育、开发者社区建设。感谢关注!

学机器人SLAM/3D视觉,就上cvlife.net 


独家重磅课程官网:cvlife.net

全国最大的机器人SLAM开发者社区


技术交流群



—   版权声明  —

本公众号原创内容版权属计算机视觉life所有;从公开渠道收集、整理及授权转载的非原创文字、图片和音视频资料,版权属原作者。如果侵权,请联系我们,会及时删除

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/149488
 
285 次点击