本节讨论基于Halcon的镜头畸变矫正,这部分是后续诸多高级应用的基础。此为上篇,主要介绍径向畸变和切向畸变的原理及矫正方法。
1. 原理
为得到更好的成像效果,通常在相机前面添加透镜,目的是改善成像质量。但透镜对成像过程中光线传播产生影响。
常见的镜头畸变根据产生原因主要分为两类:
- 径向畸变:透镜自身形状对光线传播的影响。
- 切向畸变:组装过程中,透镜和成像平面未完成平行。
1.1 径向畸变(Radial Distortion)
由透镜形状引起的畸变称为径向畸变。在相机制造过程中,很难保证镜头的厚度完全均匀,由于制造工艺的原因,通常这种情况为中间厚、边缘薄,因而光线在远离透镜中心的地方,会发生更大程序的扭曲,这种现象在鱼眼相机中尤为明显。
在针孔模型中,直线投影至像素平面仍为直线;实际照片中,直线在图片中将变为曲线,且越靠近边缘,该现象越明显。
径向畸变分为两类:
- 桶形畸变:四边向外凸,对应于凸透镜情况
- 枕形畸变:四边向内凹,对应于凹透镜情况
特点:
- 桶形畸变:距离光轴距离越远,图像放大率越小
- 枕形畸变:距离光轴距离越远,图像放大率越大
对于两种径向畸变,穿过图像中心和光轴有交点的直线,保持形状不变
以下分别是枕形和桶形畸变示意图:
成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。
对于径向畸变,可以用光心(optical center )周围距离为的泰勒级数展开式的前几项进行描述,通常使用前两项就足够了,即k1和k2;对于畸变更大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述:
式中,(x,y)表示存在畸变时像素点的实际坐标值,也就是我们看到的坐标位置。(xcorrected,ycorrected)是经过畸变校正之后的坐标值。
1.2 切向畸变
在相机制造过程中,成像平面与透镜平面不平行,产生透视变换,如下图所示:
切向畸变与距离图像中心的距离半径有关,公式如下:
式中,p1、p2表示切向畸变矫正系数,xy是发生畸变后的角点坐标,x’ y’是畸变矫正后角点的坐标,r是曲率半径。
1.3 畸变校正模型
径向畸变和切向畸变通常同时发生在成像过程中,且两者相互独立。因此,可以将径向畸变和切向畸变合并,只需将两个畸变矫正直接加起来即可,公式如下:
3. 径向畸变矫正
3.1 相关算子说明
Halcon使用change_radial_distortion_cam_par算子用于改变相机参数的径向畸变系数,同时相应地调整其他相机内部参数(主要是主点坐标Cx和Cy),以保持相同的图像内容。换句话说,它允许你修改畸变模型而不改变图像中物体的实际投影。
算子声明:
change_radial_distortion_cam_par (Mode, CamParamIn,DistortionCoeffs, CamParamOut )
参数说明:
- CamParamIn (输入): 原始相机内部参数,格式为[Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight](需修改)
- DistortionIn (输入): 原始径向畸变系数(通常为[K1, K2, K3, P1, P2])
- DistortionOut (输入): 期望的径向畸变系数(通常为[K1, K2, K3, P1, P2])
- CamParamOut (输出): 调整后的相机内部参数
注意事项:
- 该算子主要用于改变畸变模型表示,而不是实际去除或添加畸变
- 主点坐标(Cx,Cy)会被自动调整以补偿畸变模型的变化
- 焦距(Focus)和像素尺寸(Sx,Sy)保持不变
- 对于大幅度的畸变系数变化,结果可能不准确
- 该算子通常与change_radial_distortion_image配合使用,后者实际执行图像变换
Halcon使用change_radial_distortion_image算子根据给定的相机参数变化,对图像进行径向畸变校正或引入径向畸变。它可以将图像从一种畸变模型转换为另一种畸变模型,或者完全去除/添加径向畸变。
算子声明:
change_radial_distortion_image ( Image, Region : ImageRectified : CamParamIn, CamParamOut : )
参数说明:
- Image (输入): 原始畸变图像
- CamParamIn (输入): 原始相机内部参数,包含畸变系数
- CamParamOut (输入): 目标相机内部参数,包含期望的畸变系数
- ImageRectified (输出): 校正后的图像
注意事项:
- 该算子主要用于改变畸变模型表示,而不是实际去除或添加畸变
- 主点坐标(Cx,Cy)会被自动调整以补偿畸变模型的变化
- 焦距(Focus)和像素尺寸(Sx,Sy)保持不变
- 对于大幅度的畸变系数变化,结果可能不准确
- 该算子通常与change_radial_distortion_image配合使用,后者实际执行图像变换
实例代码:
* 读取图像并灰度化
read_image (Image, 'pioneer')
rgb1_to_gray (Image, GrayImage)
* 构建相机相平面空间
gen_cam_par_area_scan_division (0.00219846, -78129.2, 5.46495e-06, 5.5e-06, 318.206, 236.732, 640, 480, CamParIn)
* 修改相机参数,完成径向畸变矫正
change_radial_distortion_cam_par ('adaptive', CamParIn, 0, CamParOut)
change_radial_distortion_image (GrayImage, GrayImage, ImageRectified, CamParIn, CamParOut)