镜头的几种畸变

镜头畸变主要表现为桶形和枕形,由透镜的物理属性造成,导致图像边缘挤压或拉伸。畸变程度随远离光轴增加而加剧,可用泰勒级数展开描述,如k1、k2参数。切向畸变源于透镜与传感器平面的不平行,常由安装偏差引起,用p1、p2参数描述。线性畸变则在拍摄直线结构时显现。

        镜头畸变,实际上就是光学透镜所具有的透视失真属性,也正是由于镜头的透视造成了失真。通常失真会造成图像边缘产生挤压或拉伸的结果,当边缘向外拉伸时,我们称之为桶形畸变 ;当边缘向内挤压时,称之为枕形畸变。在失真的情况下,会造成越往边缘失真越严重,越往中心变形越小的现象。由于无法判断原有物体的实际形状,因此失真效果对于后期制作是非常不利的。这个是透镜的固有属性( 凸透镜汇聚光线、凹透镜发散光线)。

       桶形畸变(桶形失真)是由于镜头中透镜物理性能及镜片组结构使成像画面产生桶形膨胀状的失真效果。          

                                      

       枕形畸变(枕形失真)是由距离光学轴线的远近来决定的。我们在使用长焦镜头或使用变焦镜头的长焦端时,较容易产生枕形畸变效果。
                                  

       成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述,成像仪上某点根据其在径向方向上的分布位置,调节公式为:

                            

       切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。畸变模型可以用两个额外的参数p1和p2来描述:

                          

                             

       线性畸变是当试图近距离拍摄高大的直线结构实际上平行的线条显得并不平行了,这种失真现象被称为线性畸变。

                                            

                        

 

 

           

### 镜头畸变模型的原理 镜头畸变是指由于光学系统的物理特性,使得拍摄到的图像与实际场景存在几何偏差的现象。这种现象通常分为径向畸变和切向畸变两种主要形式。 #### 径向畸变 径向畸变是最常见的畸变类型之一,它由镜头中心向外辐射的方向上发生变形引起。对于鱼眼镜头来说,其径向畸变尤为显著。OpenCV 提供了一种基于多项式的模型来描述径向畸变的影响: \[ x_{distorted} = x(1 + k_1r^2 + k_2r^4 + k_3r^6) \] \[ y_{distorted} = y(1 + k_1r^2 + k_2r^4 + k_3r^6) \] 其中 \( r \) 是像素点距离图像中心的距离,\( k_1, k_2, k_3 \) 则是用于表示不同阶次径向畸变程度的系数[^1]。 #### 切向畸变 除了径向畸变外,还可能存在因镜头装配不精确而导致的切向畸变。该类畸变通过如下公式表达: \[ x_{distorted} = x + [2p_1xy + p_2(r^2+2x^2)] \] \[ y_{distorted} = y + [p_1(r^2+ 2y^2)+ 2p_2xy] \] 这里引入了两个新的参数 \( p_1 \) 和 \( p_2 \),它们反映了切向方向上的偏移量变化规律[^2]。 ### OpenCV中的鱼眼校正实现方法 针对鱼眼镜头特有的强畸变特点,自OpenCV 3.0起新增加了一个专门处理此类问题的功能模块——`cv2.fisheye`子库。此模块采用了Kannala提出的通用近似模型来进行建模计算[^1]。具体而言,在执行鱼眼图像矫正过程中涉及到以下几个核心要素及其操作方式: - **内参矩阵 (K)** 这是一个3×3大小的矩阵,记录着摄像机内部结构的相关信息,比如焦距(focal length)以及主点(principal point)位置等重要数据项[^3]。 - **畸变系数 (D)** 它们构成了一个长度为4的一维数组 `[k₁, k₂, k₃, k₄]` ,分别对应于不同程度下的非线性失真效应强度指标值[^3]。 下面给出一段完整的C++风格代码片段展示如何调用上述提到过的API完成整个流程: ```cpp void CreateUndistortedImage(const cv::Mat& origin, cv::Mat& undistorted, cv::Mat& K, cv::Mat& D, const double factor) { cv::Mat map_x, map_y; cv::Mat P = K.clone(); double fx = K.at<double>(0, 0); double fy = K.at<double>(1, 1); // Adjust focal lengths according to the given scaling factor. P.at<double>(0, 0) *= factor; P.at<double>(1, 1) *= factor; // Initialize distortion correction and rectification maps based on provided parameters. cv::fisheye::initUndistortRectifyMap( K, D, cv::Matx33d::eye(), P, cv::Size(origin.cols, origin.rows), CV_16SC2, map_x, map_y ); // Apply remapping function using precomputed mappings from previous step. cv::remap( origin, undistorted, map_x, map_y, cv::INTER_LINEAR ); } ``` 以上程序定义了一个名为 `CreateUndistortedImage()` 的函数,接受原始输入图像(`origin`)以及其他必要的配置选项作为参数,并最终输出经过矫正后的版本存储至变量 `undistorted` 当中。 ### 结论 综上所述,无论是传统意义上的标准针孔投影还是特殊设计用途广泛使用的广角甚至超广角即所谓的“鱼眼镜”,都不可避免地面临一定程度范围内的形变困扰;而借助现代计算机视觉技术手段特别是开源框架如OpenCV所提供的强大功能支持,则能够有效解决这些问题并获得更加清晰准确的结果表现出来给用户看。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值