【机器视觉】——畸变与矫正

目录

一、什么是畸变?畸变的原因是什么?

1、径向畸变(桶形畸变和枕形畸变)

2、切向畸变(薄透镜畸变和离心畸变)

 二、畸变矫正

 1、径向畸变矫正

2、切向畸变矫正

 3、畸变矫正过程

1)求解畸变矩阵

 2)根据畸变矩阵来进行图像矫正

        ①畸变模型

        ②求解步骤

 学习笔记:

 ③附录知识——双线性插值



一、什么是畸变?畸变的原因是什么?

透镜的畸变主要分为径向畸变和切向畸变,还有薄透镜畸变等等,但都没有径向和切向畸变影响显著,所以我们在这里只考虑径向和切向畸变

1、径向畸变(桶形畸变和枕形畸变)

径向畸变是由于透镜形状的制造工艺导致。且越向透镜边缘移动径向畸变越严重。下图所示是径向畸变的两种类型:桶形畸变和枕形畸变。

实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,这种现象来源于“筒形”或“鱼眼”的影响。
如下图,光线在原理透镜中心的地方比靠近中心的地方更加弯曲。对于常用的普通透镜来说,这种现象更加严重。筒形畸变在便宜的网络摄像机中非常厉害,但在高端摄像机中不明显,因为这些透镜系统做了很多消除径向畸变的工作。

2、切向畸变(薄透镜畸变和离心畸变)

切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。切向畸变是由于透镜和CMOS或者CCD的安装位置误差导致。因此,如果存在切向畸变,一个矩形被投影到成像平面上时,很可能会变成一个梯形

 二、畸变矫正

参考:https://blog.csdn.net/humanking7/article/details/45037239

 1、径向畸变矫正

对于径向畸变,成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越来越严重。
对于径向畸变可以通过下面的泰勒级数展开式进行校正:

 

 这里的x、y是图像中的畸变后的位置坐标,通过校正得到真实坐标。k1,k2,k3称之为径向畸变矫正参数,r是该点距成像中心的距离

2、切向畸变矫正

切向畸变是由于透镜和CMOS或者CCD的安装位置误差导致。因此,如果存在切向畸变,一个矩形被投影到成像平面上时,很可能会变成一个梯形。切向畸变需要两个额外的畸变参数来描述,矫正前后的坐标关系为:

p1,p2为切向畸变矫正参数

 3、畸变矫正过程

1)求解畸变矩阵

这里畸变矩阵的求解是通过张正友等标定方法得到的,主要的思想是利用黑白棋盘进行标定。将世界坐标系固定在黑白棋盘上,Xw-O-Yw平面与棋盘表面重合,这样棋盘的黑白角点在世界坐标系上的Z轴方向值均为0。然后拍摄多张不同位置的黑白棋盘图像。然后利用单应性矩阵和特征点匹配的方法得到方程组,然后求解得到畸变矩阵和内外参矩阵。具体张正友标定查看网上其他文章。

 2)根据畸变矩阵来进行图像矫正

        ①畸变模型

        ②求解步骤

1)已知条件:畸变矩阵,相机内外参数,畸变后的像素坐标

2)求解:非畸变的像素坐标,即矫正后的图像

3)畸变矩阵其实就是五个参数,在张正友标定中不考虑切向畸变,因此只有3个参数,这里假设畸变矩阵有五个参数.

4)正常情况(不考虑畸变的情况),世界坐标为(Xw,Yw,Zw),相机坐标为(Xc,Yc,Zc),图像坐标为(x,y),像素坐标为(u,v)

5)假设畸变矩阵dis = [k1,k2,k3,p1,p2],畸变后的图像坐标为(xd,yd),像素坐标为(ud,vd)

6)精髓所在:则遍历正常图像上的(u,v)坐标,分别计算出畸变后的坐标(ud,vd),将(ud,vd)处的像素值赋值给(u,v),这样就可以得到正常图像了,有时候计算出来的(ud,vd)不是整数,这时候就需要通过插值的方式来得到(ud,vd)处的值,然后赋给(u,v)

伪代码:

假设图像的分辨率为H*W,非畸变图像为img,畸变后得到的图像为imgD,大小也为H*W

img中坐标为(u,v),imgD中坐标为(ud,vd)

for u in 0~H-1:
    for v in 0~W-1:
        根据u,v反解出正常的图像坐标(x,y)
        根据畸变模型求解出畸变后的图像坐标(xd,yd)
        根据xd,yd求解出畸变后的像素坐标(ud,vd)
        if ud 和 vd均为整数:
            img[u][v] = imgD[ud][vd]
        else:
            利用双线性插值计算出在(ud,vd)处的像素值value
            img[u][v] = value
return img

这时候就计算得到了矫正后的图像
          

 学习笔记:

 ③附录知识——双线性插值

双线性插值如下:

参考:https://blog.csdn.net/humanking7/article/details/45014879

双线性内插法是利用待求象素四个邻象素的灰度 (RGB可以分别进行插值) 在两个方向上作线性内插,公式推导如下

猜你喜欢

转载自blog.csdn.net/qq_45769063/article/details/120116186