第二章 光学基础与成像原理
说实话,做视觉系统这么多年,我最大的感触是——很多人一上来就调算法、跑模型,却连镜头怎么成像都没搞明白。结果呢?项目翻车,图像糊成一片,还以为是代码写错了。
这一章,咱们就把成像这件事彻底说透。你想想看,一个仿生视觉系统,说白了就是模仿人眼。人眼怎么看的,机器就怎么拍。搞懂这个,后面所有设计都会顺很多。
2.1 光的本质与视觉感知
光是什么?教科书上说,光是一种电磁波。嗯,这话没错,但做工程的人更关心的是——光怎么影响我们看到的图像。
我个人习惯把光分成三部分来理解:
- 波长:决定了颜色。可见光范围大概380nm到780nm。低于这个叫紫外,高于这个叫红外。
- 强度:决定了亮度。强度越高,图像越亮。
- 方向:决定了阴影和纹理。这个在3D视觉里特别重要。
我在项目中遇到过一件事:一个客户说他们的相机在室内拍得好好的,一到室外就过曝。后来发现,他们根本没考虑环境光的动态范围。说白了,就是没搞懂光的强度变化有多大。
核心概念:人眼能适应的亮度范围大约是10个数量级,而普通CMOS传感器只有3-4个数量级。这就是为什么机器永远无法完全替代人眼——至少在动态范围上不行。
2.2 透镜成像原理
透镜成像,这是整个视觉系统的基石。我记得刚入行时,师傅跟我说了一句话,至今记忆犹新:「透镜就是眼睛的晶状体,传感器就是视网膜。」
透镜成像的核心公式很简单:
1/f = 1/u + 1/v
其中:
- f = 焦距
- u = 物距(物体到透镜的距离)
- v = 像距(透镜到成像面的距离)
嗯,这里要注意:当物距远大于焦距时,像距约等于焦距。这就是为什么远处的物体能清晰成像在焦平面上。
实战经验:选镜头时,焦距决定了视场角。我一般这样估算——焦距越短,看得越宽,但细节越少;焦距越长,看得越远,但视野越窄。做安防监控,常用4mm到12mm;做工业检测,常用25mm到50mm。
为什么会这样?因为透镜本质上是把空间信息压缩到二维平面上。你想想看,一个三维世界,通过一个凸透镜,就变成了一个二维图像。这个过程里,深度信息丢失了——除非你用双目或者结构光。
2.3 光圈、快门与曝光
曝光三要素,这是每个做视觉的人必须刻在脑子里的东西。我刚开始做嵌入式视觉时,总觉得曝光是相机自动搞定的,直到有一次在强光下拍出来的图像全是白的……
咱们一个一个说:
光圈
光圈控制进光量。用F值表示,F值越小,光圈越大,进光越多。F1.4比F2.8进光量多一倍。
我曾经犯过一个错:为了追求低光照下的图像亮度,把光圈开到最大。结果呢?景深太浅,只有中间一小块是清晰的,边缘全糊了。后来我学乖了——光圈不是越大越好,要看应用场景。
快门
快门控制曝光时间。快门速度越快,运动物体越清晰,但进光越少。1/1000秒能冻结快速运动,1/30秒就可能拍出运动模糊。
做工业视觉时,我一般这样选:
- 静态物体:1/30到1/60秒
- 低速运动:1/100到1/250秒
- 高速运动:1/1000秒以上
曝光
曝光是光圈、快门、ISO三者的组合。ISO是传感器的感光度,ISO越高,噪点越多。
避坑指南:我曾经在一个项目中,为了省成本用了低端传感器,结果ISO一高,图像全是噪点,算法根本跑不动。后来换了高ISO性能好的传感器,问题才解决。记住——传感器质量决定了你的曝光上限。
2.4 传感器工作原理(CCD/CMOS)
传感器是视觉系统的「视网膜」。目前主流就两种:CCD和CMOS。我做了这么多年,两种都用过,各有千秋。
| 特性 | CCD | CMOS |
|---|---|---|
| 成像质量 | 高,噪点少 | 中等,噪点多 |
| 功耗 | 高 | 低 |
| 速度 | 慢 | 快 |
| 成本 | 高 | 低 |
| 集成度 | 低 | 高(可集成ADC、ISP) |
我个人习惯:做高端工业检测,用CCD;做消费级产品,用CMOS。为什么?因为CCD的像素一致性更好,适合精确测量;CMOS虽然噪点多,但速度快、功耗低、成本低,适合嵌入式系统。
传感器的工作原理其实不复杂:
- 光子打到像素上,产生电子
- 电子被收集在像素的势阱中
- 读出电路把电子数转换成电压
- ADC把电压转换成数字信号
嗯,这里有个关键点:像素大小决定了感光能力。像素越大,感光越好,但分辨率越低。这就是为什么手机摄像头像素越来越高,但夜景还是不如单反——因为单反的像素大得多。
核心结论:选传感器时,不要只看像素数。像素大小、动态范围、帧率、噪声水平,这些都比像素数重要。我见过太多人只看「2000万像素」就下单,结果拍出来的图像还不如800万像素的工业相机。
知识体系总览
下面这张图,是我自己总结的光学与成像知识体系。每次做新项目,我都会先过一遍这个框架,确保没有遗漏。
这张图把本章的核心内容串起来了。从光的本质出发,经过透镜成像,再到曝光控制,最后落到传感器上。每一步都有物理限制,每一步都影响最终图像质量。
做视觉系统,说白了就是跟光打交道。你理解光,就能用好镜头;你理解传感器,就能选对硬件。这两样搞定了,后面的算法才有意义。
我的建议:如果你刚开始做视觉项目,先别急着调算法。拿个相机,手动调调光圈、快门、ISO,看看图像怎么变。这个手感,比看一百篇论文都有用。