使用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(該篇文章主要對畸變函數進行比較)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM