社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

计算机视觉life • 2 年前 • 540 次点击  
点击上方“计算机视觉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
 
540 次点击