ISP(圖像信號處理)之——鏡頭畸變校正

透鏡由於製造精度以及組裝工藝的偏差會引入畸變,導致原始圖像的失真。鏡頭的畸變分爲徑向畸變和切向畸變兩類。

1. 徑向畸變

顧名思義,徑向畸變就是沿着透鏡半徑方向分佈的畸變,產生原因是光線在原理透鏡中心的地方比靠近中心的地方更加彎曲,這種畸變在短焦鏡頭中表現更加明顯,徑向畸變主要包括桶形畸變和枕形畸變兩種。以下分別是枕形和桶形畸變示意圖:

 

 

成像儀光軸中心的畸變爲0,沿着鏡頭半徑方向向邊緣移動,畸變越來越嚴重。畸變的數學模型可以用主點(principle point)周圍的泰勒級數展開式的前幾項進行描述,通常使用前兩項,即k1和k2,對於畸變很大的鏡頭,如魚眼鏡頭,可以增加使用第三項k3來進行描述,成像儀上某點根據其在徑向方向上的分佈位置,調節公式爲:

公式裏(x0,y0)是畸變點在成像儀上的原始位置,(x,y)是校正後新的位置。

注意這個公式,(x0,y0)是畸變的原圖上像素點的位置;(x,y)是校正後輸出圖像上像素點的位置。

實現過程是,對輸出圖的點做遍歷——以1080p的圖像爲例,從點(0,0)到點(1919,1079),一行一行的遍歷——依次找到輸出點(x, y)對應的原圖點(x0, y0)的像素值,再將(x0, y0)的值賦給(x, y)。如果計算出來的對應的原圖的點(x0, y0)不是整數,則用二次線性插值計算此點,然後賦值給(x, y)。

舉個一維差值示例:

計算得到,要用x0=0.3位置的點賦值到糾正後的圖像的對應點上。

x0=0的點RGB(120, 120, 240),x0=1的點RGB(100, 110, 250)。

那麼可以計算x0=0.3位置的

R=120*(1-0.3)+100*0.3=114;

G=120*(1-0.3)+110*0.3=117;

B=240*(1-0.3)+250*0.3=243

 

完成所有遍歷後,就得到了輸出圖像。

 

下圖是距離光心不同距離上的點經過透鏡徑向畸變後點位的偏移示意圖,可以看到,距離光心越遠,徑向位移越大,表示畸變也越大,在光心附近,幾乎沒有偏移。

 

注:OpenCV官網上對於這部分的解釋是錯了,原圖和輸出圖像說反了。但其軟件模型沒有問題。


 

2. 切向畸變

 

切向畸變是由於透鏡本身與相機傳感器平面(成像平面)或圖像平面不平行而產生的,這種情況多是由於透鏡被粘貼到鏡頭模組上的安裝偏差導致。

 

畸變模型可以用兩個額外的參數p1和p2來描述:

下圖顯示某個透鏡的切向畸變示意圖,大體上畸變位移相對於左下——右上角的連線是對稱的,說明該鏡頭在垂直於該方向上有一個旋轉角度。

 

3. 畸變模型

同時對徑向、切向畸變消除就是將兩組式子合併。

\begin{matrix}
x_{0}=x(1+k_1r^2+k_2r^4+k_3r^6)+x+2p_1xy+p_2(r^2+2x^2)\\
y_{0}=y(1+k_1r^2+k_2r^4+k_3r^6)+y+p_1(r^2+2y^2)+2p_2xy
\end{matrix}

最終可以得到5個畸變參數

\begin{matrix}Distortion coefficients = (k_1,k_2,p_1,p_2,k_3)\end{matrix}

畸變參數的一般順序是k1,k2,p1,p2,k3。之所以把k3放在最後其實也很容易理解,因爲前面說了一般k1,k2用來處理徑向畸變足矣,k3相對而言用的比較少。

在Opencv中他們被排列成一個5*1的矩陣,經常被定義爲Mat矩陣的形式,如Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0))

這5個參數就是相機標定中需要確定的相機的5個畸變係數。求得這5個參數後,就可以校正由於鏡頭畸變引起的圖像的變形失真,下圖顯示根據鏡頭畸變係數校正後的效果:

 

 

參考文章:https://blog.csdn.net/dcrmg/article/details/52950141

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章