径向畸变原理:桶形与枕形畸变的数学描述

聊到镜头畸变,咱们得先从最直观的两种形态说起——桶形畸变和枕形畸变。我在刚入行做相机标定时,第一次看到标定板图像边缘弯成那样,还以为是镜头摔坏了。后来才明白,这其实是广角镜头的「天性」。

桶形畸变 vs 枕形畸变

说白了,这两种畸变都是图像放大率随视场角变化导致的。你想想看,理想镜头应该让所有区域的放大率一致,但现实中的镜头做不到。

畸变类型 表现特征 常见场景
桶形畸变 图像中心向外膨胀,直线向外弯曲 广角镜头、手机前置摄像头
枕形畸变 图像边缘向内收缩,直线向内弯曲 长焦镜头、变焦镜头远端

为什么会这样?桶形畸变是因为镜头边缘的放大率比中心小,导致边缘像素被「压缩」到更小的区域,看起来就像桶壁向外鼓。枕形畸变正好相反——边缘放大率大于中心,像素被「拉伸」,图像边缘向内收。

关键认知:畸变本质上是一个径向对称的几何偏移。畸变程度只与像素到图像中心的距离有关,与方向无关。这是径向畸变名字的由来。

Brown-Conrady 模型中的径向畸变参数

嗯,这里要进入数学描述了。别怕,我尽量讲得接地气些。

目前工业界最常用的畸变模型是 Brown-Conrady 模型。它用一个多项式来描述畸变偏移量:

// 归一化坐标下的径向畸变模型
x_distorted = x * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)
y_distorted = y * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)

// 其中 r² = x² + y²
// (x, y) 是归一化后的理想坐标
// (x_distorted, y_distorted) 是实际畸变后的坐标

这里 k1, k2, k3 就是径向畸变参数。我个人的习惯是:

  • k1:主导项,决定畸变的主要方向和强度。k1 > 0 是枕形畸变,k1 < 0 是桶形畸变。
  • k2:高阶修正项,校正 k1 无法完全描述的畸变残余。
  • k3:更高阶项,通常用于大视场角或鱼眼镜头。

我的经验:在普通手机或监控摄像头标定时,只用 k1 和 k2 就够了。k3 一般只在视场角超过 120° 的鱼眼镜头中才需要。我曾经在一个项目中为了省事直接用了 3 个参数,结果标定结果反而因为过拟合变得不稳定——参数越多,越容易陷入局部最优。

畸变程度与镜头焦距的关系

这个问题我在项目中被问过很多次。简单说:焦距越短,畸变越明显。

为什么?因为短焦距镜头(广角)的视场角大,光线从不同角度进入镜头时,折射路径差异更大。你可以想象一下:

  • 长焦镜头(焦距 > 50mm):视场角小,光线近乎平行入射,畸变很小,甚至接近零。
  • 标准镜头(35mm-50mm):畸变轻微,肉眼不易察觉。
  • 广角镜头(焦距 < 24mm):畸变明显,尤其是边缘区域。
  • 鱼眼镜头(焦距 < 16mm):畸变极大,k1 的值可能超过 0.1。

避坑指南:我曾经在标定一个 8mm 鱼眼镜头时,发现只用 k1 和 k2 根本拟合不了边缘的畸变。后来加了 k3 才勉强收敛。但要注意——k3 的数值通常很小(10⁻⁶ 量级),如果标定结果中 k3 突然变得很大(比如 0.01),说明你的标定数据有问题,或者模型选错了。

径向畸变的知识体系

下面这张图帮你理清本章的核心逻辑:

径向畸变知识体系 径向畸变 桶形畸变 (k₁ < 0) 枕形畸变 (k₁ > 0) Brown-Conrady 模型 多项式展开 归一化坐标 径向对称假设 k₁ 主导项 k₂ 高阶修正 k₃ 鱼眼专用 焦距越短 → 畸变越大 核心公式:x_distorted = x · (1 + k₁·r² + k₂·r⁴ + k₃·r⁶) r² = x² + y²,k₁ 决定畸变方向,k₂/k₃ 做精细修正

参数的实际物理意义

我建议你把 k1、k2、k3 理解成「畸变的三个层次」:

  • k1 是粗调:它决定了畸变是桶形还是枕形,以及大致的畸变强度。在 OpenCV 标定结果中,k1 的典型范围是 -0.5 到 +0.5。
  • k2 是微调:它修正 k1 无法完全拟合的畸变残余。k2 的数值通常比 k1 小 1-2 个数量级。
  • k3 是精细修正:只在极端大视场角下才需要。我见过一些鱼眼镜头的 k3 值在 10⁻⁵ 量级,几乎可以忽略。

一个实用的判断方法:标定完成后,用校正后的图像检查边缘的直线是否变直。如果边缘还有弯曲,说明参数不够;如果中心区域出现新的弯曲,说明参数过拟合了。我曾经在一个项目中反复调参,最后发现是标定板图像数量不够——至少需要 15-20 张不同角度的图像才能稳定估计 k1、k2。

焦距与畸变的关系总结

最后,我用一个表格帮你快速对照:

镜头类型 焦距范围 畸变类型 k1 典型值 是否需要 k3
鱼眼镜头 < 16mm 桶形(强烈) -0.3 ~ -0.1 是
广角镜头 16mm - 24mm 桶形(中等) -0.1 ~ -0.02 否
标准镜头 35mm - 50mm 轻微桶形或枕形 ±0.01 以内 否
长焦镜头 > 85mm 枕形(轻微) 0.01 ~ 0.05 否

嗯,到这里径向畸变的原理就讲清楚了。记住一句话:畸变是镜头的「出厂设置」,不是缺陷,而是物理规律。我们后面要做的,就是用数学模型把这个「设置」反向补偿回去。