4. 畸变(Distortion)评价
聊到畸变,我得先跟你讲个故事。刚入行那会儿,我设计了一款广角镜头,实验室测MTF数据漂亮得很,结果一拍建筑照片,楼全歪了。嗯,从那以后,我再也不敢小看畸变这个指标。
说白了,畸变就是镜头让直线变弯的本事。它不影响清晰度,但严重影响几何真实性。你想想看,做测绘、做视觉定位,畸变没控好,后面全白搭。
4.1 畸变的定义与分类
畸变的本质是什么?我给你一个公式就明白了:
畸变 = (实际像高 - 理想像高) / 理想像高 × 100%
正值为枕形畸变,负值为桶形畸变。我习惯把畸变分为两大类:
| 类型 | 特征 | 常见场景 | 典型值 |
|---|---|---|---|
| 桶形畸变 | 像点向内收缩,直线向外弯曲 | 广角镜头、手机摄像头 | -1% ~ -5% |
| 枕形畸变 | 像点向外扩张,直线向内弯曲 | 长焦镜头、变焦镜头长焦端 | +1% ~ +3% |
| 复合畸变 | 桶形+枕形混合,呈波浪形 | 大变倍比变焦镜头 | 视场角变化 |
为什么会这样?我简单解释一下。桶形畸变通常发生在光阑前有负光焦度组时,枕形畸变则相反。我记得有一次调试一款监控镜头,怎么调都是桶形,后来发现是光阑位置放错了——往前移了2mm,畸变直接翻倍。
4.2 畸变率计算
畸变率计算,我建议你掌握两种方法:
4.2.1 光学畸变
这是最常用的定义:
D = (y' - y₀) / y₀ × 100%
其中 y' 是实际像高,y₀ 是理想像高(由视场角和焦距决定)。
4.2.2 TV畸变
这个更贴近实际成像效果:
TV畸变 = (H₁ - H₂) / H₁ × 100%
H₁ 是画面中心高度,H₂ 是画面边缘高度。我一般在做手机摄像头时特别关注这个指标,因为用户看照片最直观的感受就是画面边缘有没有变形。
4.3 畸变测试方法
畸变测试,我常用的方法有三种:
- 网格板法——最经典的方法。用精密加工的网格板作为目标,拍摄后测量网格交点位置。
- 直线法——拍摄多条平行直线,测量直线弯曲程度。我习惯用ISO 12233标准中的畸变测试卡。
- 激光点阵法——用激光点阵投影到探测器上,直接测量点阵位置偏差。精度高,但设备贵。
具体操作流程,我一般这么走:
1. 固定相机与测试卡,保证光轴垂直
2. 拍摄测试卡图像
3. 提取特征点坐标(角点或圆心)
4. 与理想坐标对比
5. 计算每个视场的畸变值
6. 绘制畸变曲线
嗯,这里要注意——测试卡必须足够大,覆盖整个视场。我踩过这个坑,用了一张小卡,边缘畸变没测到,结果量产时发现边缘变形严重。
4.4 畸变校正原理
畸变校正,说白了就是找到畸变模型,然后反向映射回去。我常用的模型是Brown-Conrady模型:
x' = x(1 + k₁r² + k₂r⁴ + k₃r⁶) + [p₁(r² + 2x²) + 2p₂xy]
y' = y(1 + k₁r² + k₂r⁴ + k₃r⁶) + [p₂(r² + 2y²) + 2p₁xy]
其中 k₁、k₂、k₃ 是径向畸变系数,p₁、p₂ 是切向畸变系数。r 是像点到光轴的距离。
校正流程我总结为三步:
- 标定——拍摄多张不同角度的棋盘格,解算畸变系数
- 映射——建立畸变图像到校正图像的像素映射表
- 插值——用双线性或双三次插值填充校正后的像素值
我个人习惯用OpenCV的cv::calibrateCamera和cv::undistort,但要注意——标定板一定要平整。我曾经用了一张贴歪的棋盘格,标定出来的畸变系数全是错的,校正后图像反而更扭曲。
下面这张图是我整理的本章知识体系,你看一眼就能理清脉络:
最后说一句,畸变评价不是孤立存在的。它和畸变校正算法、图像传感器尺寸、镜头设计都有关系。做项目时,我建议你先把畸变测准了,再谈校正。测不准,校了也是白校。