ISP(图像信号处理)之——镜头畸变校正

时间:2024-02-20 22:50:20

透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。

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