使用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)
图一
图二
2.**initUndistortRectifyMap()
**函数
1.cameraMatrix
:输入相机矩阵
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
:新的相机矩阵
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(该篇文章主要对畸变函数进行比较)