3. 畸变分类:径向畸变、切向畸变与偏心畸变

聊到镜头畸变,很多刚入行的朋友第一反应就是「画面变弯了」。没错,但这只是表象。我做了这么多年机器视觉,见过太多因为畸变没处理好导致测量精度崩盘的案例。说白了,畸变就是镜头这个光学系统不完美的产物。

今天咱们把畸变拆开揉碎了讲。我个人习惯把畸变分成三大类:径向畸变、切向畸变和偏心畸变。你可能会问,为什么分这么细?因为每种畸变的成因不同,校正方法也不一样。

核心观点:畸变校正的第一步,不是调参数,而是搞清楚你的镜头到底属于哪种畸变类型。

3.1 径向畸变:最常见的「弯」

径向畸变,说白了就是光线通过镜头时,不同半径位置的光线弯曲程度不一样。这是所有镜头都有的毛病,尤其是广角镜头。

径向畸变又分两种:

  • 桶形畸变:画面中心向外膨胀,像木桶的形状。常见于广角镜头和变焦镜头的广角端。
  • 枕形畸变:画面中心向内收缩,像枕头一样。常见于长焦镜头和变焦镜头的长焦端。

我记得有一次做手机镜头模组检测,客户反馈边缘的螺丝孔位置总是偏。查了半天,发现是镜头工作在广角端,桶形畸变把边缘的螺丝孔往外推了将近3个像素。嗯,这就是典型的径向畸变问题。

数学上,径向畸变可以用一个多项式来描述:

// 径向畸变模型
x_distorted = x * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)
y_distorted = y * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)

// 其中 r² = x² + y²,k1、k2、k3 是畸变系数
// 通常只用 k1 和 k2 就够了,k3 用于高畸变镜头

这里要注意,r 是像素点到图像中心的距离。离中心越远,畸变越明显。你想想看,边缘的像素被拉得最厉害,所以校正时边缘的精度往往最差。

我的经验:对于普通工业镜头,用 k1 和 k2 两个参数就够了。只有鱼眼镜头那种变态畸变,才需要用到 k3。别盲目增加参数,过拟合反而会让校正效果变差。

3.2 切向畸变:镜头装歪了

切向畸变,也叫薄棱镜畸变。这个名字挺形象的——就像在镜头前面加了一个薄薄的楔形棱镜,把光线往一边偏折。

为什么会这样?说白了就是镜头的光学中心和图像传感器的中心没对齐。可能是镜头安装时偏了,也可能是传感器贴片时歪了。

切向畸变的数学表达是这样的:

// 切向畸变模型
x_distorted = x + [2 * p1 * x * y + p2 * (r² + 2 * x²)]
y_distorted = y + [p1 * (r² + 2 * y²) + 2 * p2 * x * y]

// p1、p2 是切向畸变系数

你看,切向畸变和径向畸变的公式完全不同。径向畸变只跟半径 r 有关,而切向畸变跟 x 和 y 的具体位置都有关。这就导致切向畸变会让画面产生一种「拉扯」的感觉,不是单纯的弯曲。

我曾经遇到过一个项目,用工业相机做 PCB 板对位。换了新镜头后,对位精度死活达不到要求。排查到最后,发现是镜头接口的螺纹加工有偏差,导致镜头装上去后光轴偏了0.1度。就这么点偏差,切向畸变就让边缘的定位误差达到了5个像素。

避坑指南:我曾经以为切向畸变只跟镜头有关,后来发现传感器安装也会引入切向畸变。换镜头后一定要重新标定,别偷懒用之前的参数。

3.3 偏心畸变:镜头组内部的「内讧」

偏心畸变,这个名字听起来有点玄乎。其实它是指镜头内部多个镜片之间的光轴没有完全重合。现代镜头通常由好几片镜片组成,每片镜片都有自己的光轴。如果这些光轴没对齐,就会产生偏心畸变。

偏心畸变的表现形式很复杂,它既包含径向分量,也包含切向分量。说白了,它是径向畸变和切向畸变的混合体。

在实际工程中,我们通常不单独建模偏心畸变,而是把它合并到径向和切向畸变模型里一起校正。为什么?因为偏心畸变的参数太多,单独建模容易过拟合,而且计算量也大。

畸变类型 主要成因 典型表现 校正参数
径向畸变 镜头光学设计 桶形/枕形弯曲 k1, k2, k3
切向畸变 镜头与传感器安装偏差 画面拉扯、倾斜 p1, p2
偏心畸变 镜片组光轴未对齐 混合畸变,不对称 通常合并到前两者

3.4 三种畸变的视觉对比

为了让你更直观地理解这三种畸变的区别,我画了一张示意图:

三种畸变类型对比示意图 桶形畸变 枕形畸变 切向畸变 中心向外膨胀 中心向内收缩 整体向一侧偏移

从图上可以看得很清楚:桶形畸变是中心往外鼓,枕形畸变是中心往里凹,而切向畸变是整个画面往一个方向偏。偏心畸变我没单独画,因为它其实是前两种的混合体,表现起来更不规则。

3.5 实际项目中的畸变处理策略

说了这么多理论,咱们聊聊实际怎么干。我个人的工作流程是这样的:

  1. 先判断畸变类型:拍一张棋盘格照片,看看边缘的格子是弯了还是歪了。弯了是径向,歪了是切向。
  2. 选择校正模型:普通镜头用 OpenCV 的 5 参数模型(k1, k2, p1, p2)就够了。高畸变镜头再加一个 k3。
  3. 采集标定数据:至少拍 10-20 张不同角度的棋盘格照片。我建议拍 15 张以上,太少的话标定结果不稳定。
  4. 验证校正效果:校正后重新拍一张棋盘格,检查边缘的直线是否变直了。如果还有残留畸变,说明模型没选对或者标定数据有问题。

一个小技巧:标定时不要只把棋盘格放在画面中心。我习惯让棋盘格覆盖画面的四个角和中心区域,这样校正出来的参数对全画面都有效。

嗯,关于畸变分类就讲到这里。这三种畸变你搞清楚了,后面讲标定方法时就能理解为什么需要那么多参数了。记住一句话:没有完美的镜头,只有合适的校正

本章要点回顾:

  • 径向畸变:桶形和枕形,用 k 参数校正
  • 切向畸变:安装偏差导致,用 p 参数校正
  • 偏心畸变:镜片组光轴偏差,通常合并到前两者
  • 实际项目中,5 参数模型(k1, k2, p1, p2)是主流选择

专注资料整理