各位做机器视觉的朋友,或者正在往这个方向转的工程师,今天想跟你们聊一个特别基础、但又特别容易被低估的环节——打光。
我见过太多项目,算法工程师调了一个月模型,精度死活上不去,最后发现是光源角度歪了两度;也见过硬件选型时随便配了个环形光,结果反光把特征全淹没了,项目直接推翻重来。说句得罪人的话:机器视觉项目里,一半以上的疑难杂症,根源都在打光。图像采集是视觉系统的眼睛,而光源就是这双眼睛看东西时的“光线环境”。环境不对,眼力再好也白搭。
这篇文章不打算讲那些高深的光学仿真理论,就从一个实际做项目的人的角度,聊聊我这些年总结的打光技巧、选择光源的完整流程,以及不同场景下的实战方案。内容覆盖了从物理原理到选型流程、再到实际案例排坑的完整链路,不管是刚入门的新手,还是被项目折磨得焦头烂额的老手,应该都能从中找到点有用的东西。
1. 先想清楚一个问题:打光到底在解决什么
很多人一上来就纠结“用红光还是蓝光”“用环形光还是条形光”,但我觉得,在选光源之前,得先搞明白打光的本质目标是什么。
1.1 机器视觉系统里,光源不是“把东西照亮”那么简单
日常拍照时,我们希望光线均匀柔和,把场景拍得“好看”。但机器视觉不是这样,光源的核心任务是“制造对比度”,把要检测的特征和背景彻底区分开。
举个例子,你要检测一个黑色橡胶垫圈上的细小裂纹。如果打光方式不对,整个垫圈都是黑乎乎一片,裂纹和背景灰度几乎一样,算法根本无从下手。但如果你用低角度红光打上去,裂纹边缘会产生漫反射,而光滑的表面是镜面反射,相机就能在图像里看到一条明亮的裂纹线——这就是打光的价值:把“看不见”变成“看得见”,把“难检测”变成“好检测”。
我经常跟团队里的新人说一句话:光源不是耗材,而是视觉系统里的第一个“算法”。光源选对了、调好了,后面所有算法都轻松;光源没做好,算法再牛也等于在垃圾数据里挖金子。
1.2 打光直接影响像素精度和算法难易程度
结合最近大家在聊的“机器视觉动了什么会导致像素精度变化”这个话题,这里多说一句:很多人以为像素精度只跟相机分辨率和视野大小有关,其实光源对精度的贡献被严重忽视。
当打光不均匀时,同一个特征的边缘在不同位置会有不同的灰度梯度,算法提取边缘时就会出现系统性偏差——可能左边检测出来的宽度是100个像素,右边只有95个像素。这种误差不是算法能修回来的,因为它不是随机噪声,是“看起来像真的一样”的错误数据。均匀的照明是像素精度稳定的基础。另一个容易被忽视的点是光的亮度稳定性——光源使用久了或者温度变了,亮度发生漂移,图像整体灰度变化,直接影响二值化阈值和边缘提取的稳定性。这也是为什么工业现场要用带恒流控制的专用光源控制器,而不是随便拿个开关电源凑合。
2. 光的三个关键物理特性:方向、波长、偏振
理解了打光的目标之后,我们来看打光到底有哪些“旋钮”可以调。简单来说,光有三个你可以操控的物理特性,理解了这三个特性,你就理解了90%的打光方案设计。
2.1 方向:角度决定了你“看”到什么
光的照射方向,也就是入射角度,是打光设计里最重要的参数。同一个工件,光从不同角度打过去,相机看到的完全是两个世界。
这里引入两个基础概念:镜面反射和漫反射。光滑表面产生镜面反射,反射角度等于入射角度,像镜子一样;粗糙表面产生漫反射,光向各个方向散射。我们做视觉检测,本质上就是利用这两种反射的差异。
- 高角度照明(30°-60°左右):光大部分被规则反射,适合检测表面平整度、有无凹陷或凸起。
- 低角度照明(10°-30°左右):光擦着表面过去,凹凸不平的地方会产生漫反射亮点,平整区域则是暗的,特别适合检测划痕、压伤、纹理。
- 同轴光(0°左右):光垂直于表面照射并垂直反射,适合高反光平面上的字符识别。
这里有个经常被忽略的细节:光源角度微小的变化,会产生巨大的成像差异。我做过一个项目,定位精度要求正负0.02毫米,就因为光源支架松了,角度偏了大概2度,像素精度直接掉了将近5%。所以在大批量制造场景里,光源固定支架的机械刚性,和光源本身同样重要。装好了之后一定要做机械防松处理,乐泰胶、防松垫圈该上就上,这不是小题大做。
2.2 波长和颜色:互补色增强对比
光的颜色本质上是波长。不同颜色的光打在物体上,吸收和反射特性完全不同。
这里有一条黄金法则:用与目标特征颜色相同的波长,特征变亮;用与目标特征颜色互补的波长,特征变暗。互补色会让目标在暗背景上变成亮的,或者在亮背景上变成暗的,对比度一下子就拉开了。
比如一个是红色底的电路板,要检测板上的黑色字符,那用红光打就非常合适——红底把红光反射回来变成亮背景,黑色字符吸收光保持暗色,图像里就是白底黑字,二值化处理不要太轻松。反过来如果用了蓝光,红底可能变成暗色,字符也暗,整个图像灰蒙蒙,对比度拉不开。
还有一个细节:蓝光(波长更短)的散射更强,对细微表面缺陷更敏感;红光穿透性更好,适合有一定透光性的材料;红外光则常用于排除环境光的干扰,因为很多工业现场的照明光源(如白炽灯)主要能量在可见光波段,用红外光源配合红外滤镜,可以直接把环境光屏蔽掉。不过用红外时要注意相机是否带红外截止滤镜,很多工业相机出厂默认带IRCUT,得确认一下或者摘掉。
2.3 偏振:对付反光的关键武器
做视觉的人最烦什么?反光。金属表面、玻璃表面、经过抛光处理的塑料件,一旦出现镜面反光,要么过曝,要么特征被光斑盖住,算法直接崩溃。
对付反光,偏振片是最有效的武器之一。原理一句话:反射光(尤其是镜面反射)带有明显的偏振特性,而漫反射光基本是去偏振的。在光源前加一个偏振片(起偏器),在镜头前再加一个正交方向的偏振片(检偏器),这样就可以把镜面反射光滤掉,只保留漫反射光信号。
这个方案在实际项目里非常常用。比如检测锂电池表面的划痕和压痕,表面本身就是高反光的金属膜,不用偏振方案,拍出来到处是高光点,有划痕的地方完全被光斑盖住。加了偏振片之后,反光消除,划痕清清楚楚。不过偏振片会损失光强,通常要损失60%-70%的光,所以用偏振方案时,光源亮度要留足余量,或者相应增加相机的曝光时间。
3. 选择光源的完整流程:五步法
现在很多人问我,选光源到底有没有一套标准流程?我根据自己的项目经验,整理了一个“五步法”供参考。这不是什么行业标准,但按照这个流程走下来,基本不会出大错。
3.1 第一步:明确检测目标和特征优先级
这一步看着简单,但实际做起来最容易翻车。所谓“明确目标”,不是笼统地说“我要检测缺陷”,而是要具体到:
- 缺陷类型是什么?划痕、脏污、凹坑、凸起、缺料、异色?
- 缺陷的尺寸范围是多少?最小要看到多大的缺陷?
- 缺陷是在什么材质表面上?金属、塑料、玻璃、织物、纸?
- 被测物的颜色是什么?背景颜色是什么?
- 现场有没有环境光干扰?产线节拍是多快?有没有空间限制?
我举个例子:同样检测“表面划痕”,在镜面不锈钢上和磨砂塑料上,打光方案完全相反。前者要用低角度光制造暗场效果,让划痕亮起来;后者可能需要高角度光或者同轴光,否则塑料表面的漫反射本身就会让划痕淹没在背景里。
还有一个经验:如果同时要检测多种缺陷,要分优先级。一个案子可能要同时看划痕和脏污,但两者最佳打光条件往往是冲突的——划痕适合低角度暗场,脏污适合高角度明场。这时不能贪心,要么牺牲次要特征的检测能力,要么设计双工位或双光源系统分开拍,这点要在方案阶段就跟客户确认清楚。
3.2 第二步:确定照明方式(明场、暗场、背光等)
明确了目标之后,下一步是确定照明方式。这里我把常用的几种照明方式列出来,并说明适合的场景,方便对照参考。
| 照明方式 | 光源位置 | 图像效果 | 典型应用 |
|---|---|---|---|
| 明场照明 | 光源与相机同侧,高角度 | 背景亮、特征暗 | 字符识别、外形轮廓检测、平整表面缺陷 |
| 暗场照明 | 光源与相机同侧,低角度 | 背景暗、特征亮 | 划痕、裂纹、压伤、刻印检测 |
| 背光照明 | 光源在工件背面 | 轮廓黑白分明 | 尺寸测量、外形缺陷、透明物内部杂质 |
| 同轴照明 | 光经半反半透后垂直照射 | 消除反光、表面均匀 | 高反光平面字符、晶圆表面、金属纹理 |
| 圆顶照明(穹顶光) | 半球形漫反射罩 | 均匀无阴影,减少反光 | 曲面、弧形、球形产品、强漫反射表面 |
| 条形光/线阵光 | 任意角度 | 可组合灵活、照射面积大 | 大尺寸工件、流水线动态检测 |
选择的关键原则就一条:你要的是“亮特征还是亮背景”。检测划痕这类“凹陷型”缺陷,想让缺陷亮起来,选暗场低角度;检测字符这种“颜色型”特征,想让背景亮起来,选明场高角度或同轴光。
这里多说一句背光。做尺寸测量时,背光几乎是最优解。因为背光形成的是标准的二值化轮廓,边缘锐利、毛刺极少,亚像素边缘提取的精度很高。我做过一个外壳尺寸检测项目,用背光之后,重复精度从正负0.05毫米提升到了正负0.02毫米,算法代码一行没改,纯粹是打光方式换了一下,效果立竿见影。
3.3 第三步:光源类型选型
确定照明方式后,再把这个方式具体化成光源类型。市面上常见的光源类型及其特点如下:
- 环形光源:最常见,由一个环形的LED阵列构成,提供360度无死角照明。优点是结构紧凑、安装方便、价格便宜,适合大多数通用场景。但环形光的照射角度实际上是一个锥面,不是理想的“均匀平行光”,所以对于极平整表面的检测,效果未必是最好的。
- 条形光源:由一个长条形的LED阵列构成,适合大尺寸工件或者需要特定方向照明的场景。多根条形光可以自由组合,形成各种角度组合,灵活性很高。比如检测狭长金属表面,两根低角度条形光对打,效果非常理想。
- 同轴光源:内部有一个半透半反镜,光从侧面进入后垂直向下照射,反射光再透过镜片进入相机镜头。它的特点是消除了镜面反射的眩光,能清晰拍摄高反光表面上的细节,但亮度损失比较大,且对较大面积的照度均匀性有较高要求。
- 圆顶光源(穹顶光源):LED安装在半球形罩子的内壁,光经过多次漫反射之后形成非常均匀的照明环境。适合曲面、球形、弧形工件,比如药片胶囊的外观检测、精密金属零件的外观检查。均匀性是最好的,但同样有光效损失大的问题。
- 点光源:由一个或多个LED组合在极小的区域内,发光面积小、亮度高,适合配合远心镜头做同轴效果、或者对微小区域做集中照明。很多激光类的方案也会用到点光源来补光。
- 背光源:平板式的LED面光源,发光面均匀,放在工件正下方。尺寸测量、轮廓检测的首选。做背光检测时,工件和光源之间一般留一点点间隙,不要让工件紧贴光源表面,以免刮花光源扩散板以及产生干涉条纹。
- 线扫描光源:设计为一条细长亮线,专门配合线阵相机使用,照射范围是一条线状区域,亮度要求很高,适合大幅面、高速运动的连续检测场景,比如薄膜、纸张、金属带材等卷材表面检测。
新手最容易犯的错是只看外形选光源,觉得“环形光好看就选环形”。实际上环形光和条形光在同一个项目里可能都能用,但成像质量差很远。我自己有个习惯:每次选型前先画一个光路示意图,把待测工件、缺陷位置、光源角度、相机位置画出来,看一眼光的反射路径是否合理,再决定用哪个类型。
3.4 第四步:颜色波长选择
第三步定的是“光的形状”,第四步定的是“光的颜色”。颜色选择的逻辑我们前面已经讲了,这里再补充一个实操细节:光源颜色的选择要跟相机靶面尺寸、黑白/彩色相机、镜头镀膜一起考虑。
如果用的是黑白相机,颜色选择只看“对比度”,选能让目标与背景灰度差最大的波长即可。如果用的是彩色相机,有时候为了保留颜色信息做检测(比如检测标签颜色的色差),那就不能随便加滤色片,得用白色光或者全光谱光源,让颜色信息完整进入传感器。
还有一个常见操作:单色光源加对应滤镜。比如用了红光,镜头前可以加红色滤镜,进一步滤除环境光和其他杂散光,让到达相机的光更加“纯净”。这在环境光干扰严重的现场非常有用。
3.5 第五步:控制器和频闪方案
这是很多人忽略的一步,但恰恰是决定项目稳定性的关键。光源控制器不只是给LED供电那么简单,它的作用是保证光源亮度恒定和可调,以及在特定场景下实现“频闪”控制。
- 恒流控制:LED是电流驱动器件,微小的电压波动会带来明显的亮度变化。工业光源必须用恒流驱动,否则亮度飘移会直接影响成像灰度,进而影响算法结果。
- PWM调光:通过调节脉冲宽度来改变平均电流,实现亮度调节。PWM频率要选高一些(一般要求几千赫兹以上),否则某些相机在采集时会捕捉到频闪条纹。
- 频闪模式:在相机曝光瞬间,给光源一个短暂的强电流脉冲,让光源在极短时间内发出远高于额定值的亮度。这种模式的好处是:第一,可以缩短相机的曝光时间,有效冻结运动模糊;第二,可以提高光源的有效亮度,减少光源数量;第三,可以降低光源的平均功耗和发热,延长光源寿命。
频闪方案对控制器的响应速度要求比较高,一般的开关电源没法做到微秒级别的快速响应。所以如果项目的节拍很快,或者被测物在高速运动,一定要选择支持频闪模式的光源控制器,并且控制信号要和相机曝光信号做同步。这个同步可以靠硬件触发线实现,也可以通过相机的闪光灯输出信号来触发光源控制器。
4. 几个典型场景的打光方案拆解
理论讲再多,不如看几个实际案例。我把这些年做过的一些典型项目挑出来,每个案例都按“需求—难点—方案—结果”来拆解,大家可以直接参考。
4.1 金属表面划痕检测:低角度暗场是主力
这是最常见的需求之一,五金件、铝合金外壳、不锈钢板,都要检测表面划痕。难点在于:金属表面本身有纹理、有光泽,划痕的深浅不一,普通打光方式很难把细微划痕和正常纹理区分开。
我的方案是低角度条形光+暗场照明。把两根条形光源分居两侧,以极低的角度(大概10到20度)照射待测表面。光滑的表面会把光反射到远离相机的方向,在图像里表现为暗色;而划痕处的粗糙断面会产生漫反射,部分光线进入相机,表现为亮线。这样,划痕在图像里就是暗背景上的亮线,对比度非常好。如果划痕特别浅,可以进一步把光源角度压低一点,同时增加光源亮度。
这里需要注意,低角度照明的亮线宽度并不代表划痕的真实宽度,因为漫反射会“放大”细小的缺陷。所以如果客户要求对划痕宽度做定量测量,这个方案会有一定误差,需要结合像素标定做修正。
4.2 透明玻璃和薄膜缺陷检测:背光和偏振的配合
玻璃、透明塑料、薄膜这类材料最大的难点是“透明”本身。若缺陷是气泡、杂质、裂纹,用背光照明是最直接的方案——暗背景下的亮点或亮线,一目了然。
但如果缺陷是表面的“擦痕”或者“指纹”,背光就不够用了。因为这些都是表面纹理,需要“反射光”才能呈现出来。这时可以把光源放在工件上方,用低角度光照射,用另一侧的黑背景来制造暗场。更复杂的方案是加偏振片:光源前加偏振片,镜头前加正交检偏器,这样玻璃内部的应力纹理也可能被呈现出来(双折射效应),甚至可以用来检测玻璃的应力分布。
做玻璃检测时还有个大坑——牛顿环干涉条纹。当玻璃和光源扩散板贴得太近,或玻璃与玻璃之间形成微小间隙时,会出现彩色干涉条纹,严重干扰检测。避免方式就是让工件和光源之间保持几毫米以上的距离,或者用漫射效果更好的光源。
4.3 高反光工件上的字符识别:同轴光和多光谱方案
金属或者经过抛光处理的工件上,通常有激光打码、喷墨打印或者钢印的字符需要识别。难点在于高反光表面会出现强烈的镜面反射,字符区域和非字符区域容易被反光“统一”成一片亮白。
同轴光源在这个场景下很好用。同轴光垂直照射到反光平面后垂直反射回镜头,整体图像比较均匀,而字符区域因为有凹凸或颜色差异,会打破这种垂直反射关系,从而形成清晰的暗色或亮色字符。如果字符本身的材质和背景色差很大,普通光源也能搞定,但同轴光能让图像更干净,算法更稳定。
如果字符是刻印在透明材料上,可以考虑“暗场同轴”的思路,或者用结构光(一个微小的光栅投影到字符区域,通过相位变化提取浮雕信息)。
4.4 3D视觉的打光思路
最后单独聊聊3D视觉的打光,这也是这几天热词里大家都在关心的“机器视觉3D入门”话题。很多做3D项目的朋友问,3D视觉不是靠激光或者结构光重建点云吗?还需要打光吗?答案是:非常需要。
3D视觉的打光要分两种场景。第一种是激光三角法,光源本身是一个线激光器,这种情况“打光”主要考虑的是激光的波长和功率,以及环境光对激光线的干扰。红外激光容易受环境红外辐射影响,蓝紫激光的散射和吸收特性不同,需要根据材料选择最佳波长。第二种是主动结构光或双目视觉,这时候环境光对成像质量影响极大,需保证足够的照明亮度和均匀性,或者使用红外投射器+红外滤镜来排除可见光的干扰。
3D项目里最经典的翻车现场是:工件是黑色的或高反光的,激光线投射上去后反射信号太弱或者直接镜面反射到别处,导致点云大片缺失。解决的思路通常是调整激光功率、改变照射角度、给工件表面做预处理(喷粉、涂消光剂),甚至是同时用多路激光从不同方向打。
5. 常见问题与排查技巧实录
最后这部分,我整理了这些年实际项目中遇到的打光相关典型问题,以及对应的排查思路。这些问题看起来很不起眼,但每一个都让项目组掉过头发。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 图像整体过曝或某些区域过曝 | 光源亮度太高、光圈没调、环境光干扰 | 先关掉环境光试拍,再调光圈和曝光,最后才考虑降光源亮度 |
| 图像里有明暗交替的纹理 | 光源频闪(PWM频率太低)或交流电频闪 | 调高PWM频率,或者改为恒亮模式,检查是否为环境光(如日光灯)干扰 |
| 同一工件放不同位置,亮度差异大 | 光源均匀性差,或光源照射角度/距离在变化 | 用照度计测试光场分布,必要时换更均匀的光源类型 |
| 检测位置漂移导致图像忽明忽暗 | 工件来料定位不准,光源相对工件的角度在变化 | 优化机械定位,或者改用更大的照射范围、更均匀的光源 |
| 反光工件上特征被炫光盖住 | 镜面反射进入相机 | 改变光源角度,加偏振片,或换同轴光 |
| 图像边缘模糊或者有拖影 | 曝光时间太长,工件在运动 | 缩短曝光时间,提高光源亮度或开启频闪模式 |
| 光源用一段时间后亮度下降 | LED热衰减 | 检查散热和驱动电流,必要时考虑主动散热或降低额定功率使用 |
排查问题有个基本思路:先隔离因素,再逐项假设验证。环境光、相机参数、光源参数、机械位置这四类因素混在一起时,不要凭感觉调,先关掉所有不确定项(比如关掉环境灯、把曝光调小),再一项项加回来,看图像是什么时候变差的,问题源头就很容易定位了。
另外一个很实用的技巧是:在实验室搭一个简易的“光学校准台”。一个小光学面包板、一套可以自由调节高度和角度的光源支架、几块亚克力板做背景,加起来没多少钱,但能让你在打光调试时少走很多弯路。每次拿到新工件,先在光学校准台上试出最佳光路,再去现场按图索骥搭固定支架,效率提升非常明显。
6. 几点写在最后的经验和建议
如果文章到这里,你问我“打光这件事最核心的能力是什么”,我会说:不是光学知识,而是“观察图像并反推光路”的能力。拿到一张图像,看到某个区域过曝,你脑子里应该能大概推出来“是哪个方向来的光造成了这个反射”,然后下意识地知道“往哪个方向调光源角度”。这种能力只有靠大量项目实践才能积累出来,一开始就是不断试错、记录参数、总结经验。
给新入行或者正在学习机器视觉的朋友一些学习路线上的建议:
- 先吃透成像原理。相机靶面尺寸、镜头焦距、工作距离、视野范围这四者的换算关系要滚瓜烂熟,这是所有视觉方案的基础。
- 再练好打光基本功。找几样典型工件——金属、塑料、玻璃、PCB板,用不同的光源、角度、颜色去拍,观察并记录图像差异,建立自己的“成像经验库”。
- 有余力再学算法。其实有了好的图像,很多“高级算法”根本用不上,一个阈值分割加一个Blob分析就够了。图像质量上去了,算法只是锦上添花。
- 面试或者做方案汇报时,把打光设计思路讲清楚,往往比秀多少个模型更能打动面试官。因为这说明你真的在解决工程问题,而不只是在跑代码。
我个人的习惯是,每一个项目结束之后,把当时的光路图、光源型号、参数设置、现场照片归档成一份“打光案例库”。两三年的时间积累下来,很多新项目根本不需要从零开始试光,直接在案例库里找类似的场景,套用之前的参数,微调一下就能定方案。那感觉,真的比每次都在实验室摸黑试光要踏实太多了。
打光这件事,看起来是视觉系统里最“物理”的一环,但它直接决定了算法的上限。希望这篇文章能帮你少踩几个坑,少加几个月的班。以后再遇到“图像效果不理想”,先别急着折磨算法工程师,去光源那里多看看,说不定问题就迎刃而解了。