成像基础:小孔成像模型、透镜成像原理与像差分类
各位同学好,我是老张。今天咱们聊聊成像基础。说实话,这部分内容看着像理论课,但你要是搞懂了,后面调镜头、做标定的时候,能少走不少弯路。
我刚开始做机器视觉那会儿,总觉得理论是书本上的事,实际干活靠经验就行。结果有一次,一个高精度测量项目,怎么调都差那么几个像素。折腾了两天,最后发现是镜头畸变没处理好。嗯,从那以后,我再也不敢小看这些基础原理了。
小孔成像模型:最朴素的相机
先说说小孔成像。你想想看,一个黑盒子,前面戳个小孔,光线穿过小孔,在后面的屏幕上形成倒像。这就是最原始的相机。
小孔成像模型有几个特点:
- 线性关系:物体大小和像的大小成比例,比例系数就是放大率
- 没有畸变:理论上小孔成像没有几何畸变,因为光线是直线传播的
- 景深无限:不管物体多远,都能清晰成像
但问题来了——小孔太小,进光量不够,成像太暗。所以实际相机都用透镜。不过小孔模型作为数学抽象,在标定算法里还是核心。说白了,我们做畸变校正,本质上就是找一个映射,把透镜拍出来的图像,映射回小孔模型下的理想图像。
核心要点:小孔成像模型是理想模型,透镜成像是现实模型。畸变校正就是让现实向理想靠拢。
透镜成像原理:从理想走向现实
透镜成像,说白了就是用凸透镜把光线汇聚到一点。高斯成像公式大家都学过:
1/f = 1/u + 1/v
其中 f 是焦距,u 是物距,v 是像距。这个公式在理想情况下成立,但实际镜头是多个透镜的组合,而且每个透镜都有加工误差。
我记得有一次,客户要求测量精度到0.01mm。我选了一款号称"低畸变"的工业镜头,结果实测畸变还是超过了0.5%。后来才发现,那个镜头在标称的"最佳工作距离"下确实畸变小,但稍微偏离一点,畸变就上来了。所以我现在选镜头,都会要求厂家提供全视场的畸变曲线,而不是只看中心区域。
像差分类:五种常见的"不完美"
透镜成像不可能完美,总会有各种像差。我习惯把像差分成两大类:单色像差和色差。今天重点讲单色像差,一共五种。
先看一张图,帮你快速建立整体认知:
1. 球差
球差,说白了就是透镜边缘和中心对光线的折射能力不一样。边缘光线聚焦得近一些,中心光线聚焦得远一些。结果就是一个点光源,在像面上成了一个模糊的圆斑。
我在项目中遇到过,用大光圈镜头拍高反光的金属表面,边缘总是发虚。后来缩小光圈,球差就明显改善了。所以做高精度测量,我一般建议用F8以上的光圈。
2. 彗差
彗差这个名字很形象——点光源经过透镜后,像点拖出一条尾巴,像彗星一样。这通常是因为透镜的光轴没有对准,或者透镜本身有偏心。
避坑指南:我曾经买过一批廉价镜头,装到相机上发现画面左上角总是有拖尾。一开始以为是传感器问题,后来换了镜头就好了。嗯,镜头组装工艺不好,彗差就会很明显。
3. 像散
像散比较有意思。一个十字形的物体,水平线条和垂直线条不能同时清晰。你调焦让水平清晰了,垂直就模糊了;反过来也一样。
为什么会这样?因为透镜在不同方向上的曲率半径不一样。这就像你用一个椭球形的镜片,一个方向聚焦快,另一个方向聚焦慢。
4. 场曲
场曲,就是像面不是平的,而是弯的。你想想看,透镜本身是球面,它成的像自然也是球面。但我们的传感器是平的,这就矛盾了。
实际表现就是:画面中心清晰了,边缘就模糊;边缘调清晰了,中心又模糊。做大幅面测量时,场曲特别头疼。我一般会用景深来弥补,或者干脆用远心镜头。
5. 畸变
终于说到畸变了。这是咱们做标定最关心的像差。畸变不影响清晰度,但影响几何位置。说白了,就是直线拍出来变弯了。
畸变分两种:
- 桶形畸变:画面向外鼓,像桶一样。常见于广角镜头
- 枕形畸变:画面向内凹,像枕头。常见于长焦镜头
我的经验:做标定时,畸变模型一般用多项式拟合。最常用的是Brown模型,包含径向畸变和切向畸变。径向畸变用r²、r⁴、r⁶三项就够了,再多就容易过拟合。
像差对比一览
| 像差类型 | 主要表现 | 常见原因 | 对测量影响 |
|---|---|---|---|
| 球差 | 点光源成模糊圆斑 | 透镜球面形状 | 降低分辨率 |
| 彗差 | 点光源拖尾 | 透镜偏心/倾斜 | 不对称模糊 |
| 像散 | 不同方向清晰度不同 | 透镜非对称曲率 | 方向性模糊 |
| 场曲 | 中心和边缘不能同时清晰 | 像面弯曲 | 视场不均匀 |
| 畸变 | 直线变曲线 | 透镜设计/组装 | 几何位置误差 |
注意:畸变是唯一一种不影响图像清晰度、但严重影响测量精度的像差。很多新手只关注镜头分辨率,忽略了畸变,结果测量数据偏差很大。我建议,做测量项目之前,先做一次畸变标定。
小结
今天讲了成像基础,从小孔模型到透镜原理,再到五种像差。说白了,这些知识就是帮你理解:镜头为什么拍出来和理想不一样?知道了原因,才能对症下药。
下一章咱们会深入讲畸变校正的具体方法,包括标定板设计、特征点提取、畸变参数求解。到时候我会拿实际项目的数据出来,手把手带大家走一遍流程。