使用python+opencv进行图像的去畸变

一、去畸变的分类:

1.1.在普通相机cv模型中,畸变系数主要有下面几个:(k1; k2; p1; p2[; k3[; k4; k5; k6]] ,其中最常用的是前面四个,k1,k2为径向畸变系数,p1,p2为切向畸变系数。

2.在fisheye模型中,畸变系数主要有下面几个(k1,k2,k3,k4)

这篇文章主要介绍普通相机cv模型

二、去畸变的两种方法

其实去畸变可以分为有两种方法(每种方法均给出参数链接,有兴趣可以跳转查看)

1.getOptimalNewCameraMatrix+undistort(本篇文章简写为GU)
2.getOptimalNewCameraMatrix+initUndistortRectifyMap+remap(本篇文章简写为GIR)

区别:GU方法中的undistort其实是第二种方法GIR中initUndistortRectifyMap+remap的结合,在调用undistort函数的时候,内部其实就是在调用initUndistortRectifyMap+remap。

使用范围:对于一张图片,GU方法和GIR方法都可以使用,但是当图片多的时候,GU方法就会浪费时间,因为initUndistortRectifyMap()这个函数在处理多个图片时,他的输出(mapx、mapy)其实只要计算一次就够了,然后把(mapx、mapy)作为remap的其中两个输入进行畸变校正,只需要多次调用remap即可。

三、函数分析

1.**alpha**参数

这里主要说一下getOptimalNewCameraMatrix()函数中的alpha参数,他的大小在0~1之间,如果
alpha=1,原图像的所有像素能够得到保留,也就是在去畸变之后会出现黑色区域;alpha=0,会将黑色像素去除;在0~1之间,会按照比例重新计算fx,fy,cx,cy。这里alpha的取值,其实是在改变inner和outer矩阵

事实上,内矩阵inner(alpha=0)等同于不含任何黑色边框的图幅大小,而外矩阵outer(alpha=1)等同于原图大小

图片引用自一篇文章(https://blog.csdn.net/a472609409/article/details/90515742)
图一
alpha=1
图二

alpha=1
2.**initUndistortRectifyMap()**函数

1.cameraMatrix:输入相机矩阵1

2.distCoeffs:输入参数,相机的畸变系数:(k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]]),有4,5,8,12或14个元素。如果这个向量是空的,就认为是零畸变系数。
3.R:可选的修正变换矩阵,是个3*3的矩阵。通过stereoRectify计算得来的R1或R2可以放在这里。如果这个矩阵是空的,就假设为单位矩阵。在cvInitUndistortMap中,R被认为是单位矩阵。
4.newCameraMatrix:新的相机矩阵2

5.size:未畸变的图像尺寸。
6.m1type:第一个输出的映射的类型,可以为 CV_32FC1, CV_32FC2或CV_16SC2,参见cv::convertMaps。
7.map1:第一个输出映射。
8.map2:第二个输出映射。

3.**undistort()**函数

如果undistort函数的最后一个参数使用原相机内参,那么得到的结果就是上面图1的结果,相当于alpha=0的情况。

如果undistort函数的最后一个参数使用getOptimalNewCameraMatrix计算出来的新矩阵,那么得到损失像素后的图像,也就是当alpha=1时,得到上面图2的结果。

四、总结

好了,对于图片的矫正,还有两个函数,分别是getOptimalNewCameraMatrix,remap,不过这两个函数没有太多太容易出错的地方,根据上面给出的参数链接就可以写对。

目前这篇文章只是对图像进行去畸变,如果要对某一个像素点进行去畸变,可以参考引用5,里面有具体介绍!

目前学到这些,后续我也要对某一个像素点进行去畸变,到时候再进行更新!

五、引用

感谢下列文章的帮助:
1.https://www.cnblogs.com/riddick/p/6711263.html
2.https://blog.csdn.net/a472609409/article/details/90515742
3.https://blog.csdn.net/u013341645/article/details/78710740
4.https://zhuanlan.zhihu.com/p/74133719
5.https://zhuanlan.zhihu.com/p/137053640(该篇文章使用C++进行编写,但是内容还是排版都看到很舒服)
6.https://www.jianshu.com/p/6daa8dbbfa30(该篇文章主要对畸变函数进行比较)

原文地址:https://www.cnblogs.com/ycycn/p/14063841.html