机器视觉明场与暗场成像:照明选型与缺陷检测调试指南

1. 明场与暗场,为什么值得单独拎出来讲

前阵子接到一个检测需求:金属拉丝面板上的细微划痕,宽度大概 3 到 5 微米,深度不到 2 微米。第一版方案用的是同轴光源加远心镜头,典型的明场打法,图像干净漂亮,表面纹理、丝印、倒角全都清清楚楚,唯独划痕几乎看不见——只有在特定角度下才能隐约瞄到一条比周围稍亮的线,换个工件就没了。折腾了两天才想明白,问题不在相机也不在算法,在于明场根本就不是为这类缺陷设计的:镜面反射把整片表面照得一样亮,划痕带来的那点散射光淹没在背景里,对比度压到了 1% 以下。换成低角度环形光做暗场照明之后,情况直接反转——背景暗下去,划痕像被人用刀刻出来一样亮着,同一台相机、同一个镜头,对比度从个位数跳到 60% 以上,阈值分割一次就干净了。

这就是机器视觉里明场与暗场的分野。它俩不是“两种灯”的区别,而是两条完全不同的物理路径:明场收的是镜面反射和漫反射,暗场收的是散射。搞不清这一点,选型就全靠试,试十次中一次,剩下九次都在怀疑相机、怀疑镜头、怀疑算法。这篇文章我把这几年在光学成像上踩过的坑梳理一遍,从照明几何、参数计算、光型选型一直讲到现场排查,适合刚入行做视觉方案的朋友,也适合已经能出图但总在某些缺陷上卡住的同行对照着看。文中所有参数和案例都来自通用工程实践,具体项目各不相同,公式和思路可以直接拿去套。

1.1 一句话说清:反射光到底进没进镜头

判断一个照明方案属于明场还是暗场,标准只有一条——照明光经工件表面反射后,主反射方向有没有落进镜头的入瞳。落进去了,就是明场:镜头看到的是一片被照亮的表面,灰度差异来自各区域反射率的不同,印刷字符、颜色分区、镀层边界都属于这一类。没落进去,就是暗场:镜头视野里的背景是黑的,只有那些把光“打散”的微观结构——划痕边缘、毛刺、颗粒、裂纹、表面凸起——才会把光散射进镜头,形成亮信号。

这个划分跟用什么灯没有必然关系。同样是环形光,装在镜头正下方几十毫米处向下直打,是明场;放到工件侧面几乎贴着台面斜射,就变成了暗场。同样一个同轴光源,配普通镜头是明场,配带环形反射镜的暗场模块,出来的又是暗场。灯是工具,几何关系才是本质。我见过太多方案文档把“环形光=暗场”“同轴光=明场”当成公式写进去,结果换一个工件高度,整个方案就崩了。

提示:判断明暗场时,别去看光源型号,拿张白纸放在工件位置,从镜头方向看过去——能看到光源的直接反射像,就是明场;看到的是一片暗,只有边缘发亮,就是暗场。这个土办法比任何手册都快。

1.2 显微语境和工业视觉语境,说的不是一回事

这两个词在光学显微镜里已经用了一百多年,含义相对固定:明场是透射或反射照明,光从聚光镜均匀照到样品上,样品吸收或反射差异形成对比;暗场则是用特殊聚光镜把光变成一束中空的锥形光,从样品外围斜射过来,只有被样品散射的光才进入物镜。显微暗场的标志性特征是背景全黑、边缘发光,看未染色的透明标本、看细菌鞭毛,全靠这一手。

工业机器视觉借用这两个词的时候,语义被放宽了。工业现场的“暗场”往往只是指低角度斜射照明产生的低背景效果,并不追求显微暗场那种严格的锥形照明和数值孔径匹配;工业现场的“明场”也常常混着漫射罩、穹顶光这类无影照明,跟显微明场的均匀透射完全是两个路数。这个语义漂移带来一个实际问题:跟供应商沟通时,你说“要暗场”,对方可能给你一个低角度环,也可能给你一个真正的暗场环,两者的入射角、工作距离、光通量差好几倍,价格也差好几倍。

我的做法是,沟通时不说名词,直接说角度和距离:光要以多大角度入射、离工件多高、工件尺寸多大、镜头工作距离多少。把几何参数讲清楚,误会就少了大半。

1.3 为什么先定明暗场,再定其他

一套视觉方案里,光源、镜头、相机、算法的耦合关系是自上而下的。明暗场的决定,实际上决定了三件事:信噪比的上限、镜头数值孔径的选择方向、曝光时间的量级。明场下表面亮度高,曝光可以压到几十微秒,飞拍没问题;暗场下只有散射光,光通量可能只有明场的百分之几,曝光要拉到几百微秒甚至几毫秒,这时候运动模糊和振动就成了主要矛盾,得反过来要求机构刚性、要求相机灵敏度、要求光源功率。

先把这条路定下来,后面的选型才有依据。反过来说,如果先买了相机再想光怎么打,很容易出现“相机分辨率很高但图像全是噪声”或者“光源功率拉满还是一片黑”的尴尬局面。

2. 明场成像:最熟悉,也最容易做坏

2.1 明场的照明几何与三个成立条件

明场要成立,需要三个条件同时满足。第一,主反射方向对准入瞳。对于平面工件配同轴光,这一点天然成立;对于曲面、斜面、拉丝面,主反射方向随位置变化,就得靠大面积的漫射光源去“包住”这些方向,穹顶光、圆顶无影光就是为这个存在的。第二,表面反射率差异要足够大。明场靠反射率差异成像,如果缺陷和目标区域的反射率接近,再怎么调曝光也分不开,这时候必须换模式而不是换参数。第三,照明均匀性要压得住。明场图像里,照度不均会直接变成灰度梯度,后面做阈值、做模板匹配都会被这个梯度带偏。

均匀性这件事被低估得很厉害。我用过的方案里,为了省钱用两颗条形光对打,中间亮两边暗,中心到边缘的灰度差能到 30 个灰阶,做平整表面检测时几乎没法用固定阈值。后来换成积分球式的穹顶光,均匀性能压到 ±3% 以内,同样的算法直接跑通。光源的钱花在均匀性上,回报率比花在功率上高得多。

2.2 光源与镜头的匹配计算

明场选型里最常用到的几个量,我列在这里,实际调机时基本靠它们估算起点。

镜头半孔径角 α 决定了镜头“能收多大范围的光”:

α = arctan(D / (2 × WD))

其中 D 是镜头入瞳直径,WD 是工作距离。举个例子,某 50 mm 焦距镜头,入瞳直径约 25 mm,工作距离 200 mm,那么 α = arctan(25 / 400) ≈ 3.6°。这个角度很小,说明镜头只收非常接近光轴的光,同轴照明正好对上。

视场和像素当量:

FOV = 靶面尺寸 / 放大倍率 M像素当量 = 像元尺寸 / M

假设用 2/3 英寸靶面(约 8.8 mm × 6.6 mm)、500 万像素、像元 3.45 μm 的相机,配 0.5 倍远心镜头,则视场约 17.6 mm × 13.2 mm,像素当量 6.9 μm。要检测 3 μm 宽的划痕,像素当量 6.9 μm 明显不够——这也是前面那个案例里,即使换成暗场也得同时提高放大倍率的原因。

衍射极限用来判断“加了倍率还能不能看清”:

d = 0.61 × λ / NA

取 λ = 500 nm,NA = 0.1,则 d ≈ 3.05 μm。也就是说,NA 只有 0.1 的普通工业镜头,理论分辨率就在 3 μm 量级,再往上堆像素是白费。想看清 1 μm 级的细节,NA 至少要 0.3 以上,工作距离会被压得很短,光源的安装空间也跟着变窄,这些都得提前算。

景深估算:

DOF ≈ λ / (2 × NA²) + 像素当量 / (M × NA)

第一项是衍射贡献,第二项是几何贡献。NA 0.1、M 0.5、像素当量 6.9 μm 的情况下,第一项约 25 μm,第二项约 138 μm,加起来 160 μm 上下。这个数字很关键——如果工件高度波动超过景深,图像会整体发虚,明场的对比度会断崖式下降,很多人误以为是对焦问题,其实是景深不够。

2.3 明场做不好的四种典型表现

第一种,整片发白,缺陷发灰。多见于抛光金属、镜面、玻璃这类高反表面。原因是对面有杂散光,或者光源功率过曝。处理办法是收小光圈提高对比度、加偏振片压掉镜面成分、把光源调暗。偏振这招在金属件上特别好用,起偏片装在光源前、检偏片装在镜头前,旋转检偏片到最暗位置,镜面反射被压掉一大截,表面纹理和浅凹坑反而浮出来。

第二种,中间亮四周暗。典型的光源覆盖不足或者距离太近。环形光的有效照射区域跟安装高度强相关,高度不够时中心过曝、边缘欠曝。经验值是安装高度不小于工件对角线长度的 0.6 倍,具体还得看光源的发光角。

第三种,反光斑随工件移动。曲面件、冲压件上常见。这是明场的固有问题,靠调参解决不了,只能换漫射照明或者改成暗场。

第四种,图像很干净但没法测量边缘。这是把明场当背光用的典型错误。做尺寸测量、轮廓提取,应该用背光(透射明场),让工件变成剪影,边缘锐利、无内部干扰;用反射明场去测边缘,边缘两侧都有亮度过渡,亚像素精度上不去。

3. 暗场成像:把散射变成信号

3.1 让背景黑下去的三个工程条件

暗场要成立,条件比明场苛刻。第一,照明光的镜面反射方向必须避开入瞳。对于水平放置的平面工件,光以与光轴夹角 θ 入射,反射光与光轴夹角也是 θ,只要 θ 大于镜头的半孔径角 α,镜面反射就进不去。实际工程里,考虑到工件翘曲、镜头杂散光、表面粗糙度的随机性,通常取 θ ≥ 3α 甚至更大,常见做法是把光源压到 10° 到 20° 的低仰角,让光几乎贴着表面掠射。

第二,要有足够强的散射体。暗场图像的亮度完全来自缺陷的散射,如果缺陷太小、太浅、折射率差异太小,散射光弱到淹没在噪声里。这就是为什么暗场对光源功率和相机灵敏度的要求比明场高一个档次。

第三,环境杂光必须压住。暗场背景本来就只有几个灰阶,环境里一点点顶灯、窗户、指示灯的漏光,就能把背景抬到几十灰阶,对比度全丢。加遮光罩、关掉工位照明、镜头加遮光筒,这些都是必须做的基础动作,不是可选项。

3.2 三条实现路径,各有各的适用面

低角度环形光是最常见的做法。光源由多圈 LED 组成,安装在镜头下方紧贴工件的高度,以很小的仰角向外斜射。优点是结构简单、成本低、视场内亮度比较均匀;缺点是对工件高度敏感,工件上下浮动几毫米,入射角就变了,暗场效果跟着变。适合平面度好、高度稳定的工件。

**暗场环(锥形暗场)**把 LED 做成一个锥面,光线以固定角度汇聚到工件上一点。角度可控性好,工作距离有一个明确的最佳值,串扰小;缺点是对大视场不太友好,视场边缘的角度会偏。适合小视场、高倍率、缺陷微小的场合。

同轴暗场用环形反射镜把光从侧面引入、经抛物面反射成中空的锥形光束,从物镜外围斜射下去。这是显微暗场的工业版,入射角由反射镜决定,不受工件高度影响,稳定性最好,代价是结构复杂、价格高、工作距离受限。

三条路径没有优劣,只有匹配。我在一个透明薄膜检测项目里试过前两种,低角度环在小视场里够用,但视场放大到 60 mm 宽之后边缘的入射角明显偏小,缺陷亮度从中心到边缘掉了 40%,最后只能用两侧对称的条形光加弧形反光板自己搭了一套。这类“买不到就自己搭”的情况在暗场里比明场多得多。

3.3 暗场调试的参数敏感度

暗场调起来比明场费劲,因为它的有效信号对参数极其敏感。我一般按这个顺序动:

先定入射角。从侧上方开始,让光源以一个明确的角度斜射,一边转一边看图像,找到背景最暗、缺陷最亮的那个角度区间。这个区间通常只有几度宽,转过去一点背景就亮起来了。

再定高度。低角度环的高度决定了光线打到工件上的实际仰角,也决定了照明的覆盖范围。高度越低,暗场效果越强,但覆盖范围越小。工件尺寸大的时候,这是一个必须做的取舍。

最后定功率和曝光。暗场下我习惯把光源功率开到 70% 以上,靠曝光时间调节亮度,这样光源的驱动电流稳定,色温和输出波动小。曝光时间不要吝啬,暗场曝光比明场长五到十倍是常态。但这里有个硬约束:曝光时间乘以运动速度,不能超过一个像素当量,否则运动模糊直接把散射亮点拉成一条线。飞拍场景下,暗场要么提高光源功率,要么降速,没有第三条路。

白平衡也要单独说一下。暗场图像整体偏暗,自动白平衡基本失效,容易偏色。我的做法是先用明场或者标准白板做一次白平衡,锁定参数之后再切暗场,这样不同批次之间的灰度一致性会好很多。

4. 从缺陷特征反推光型:选型决策

4.1 按几何特征分类的选型对照

光型选型不该从“我有什么灯”出发,应该从“缺陷长什么样”出发。下面这张表是我自己常用的决策依据,按缺陷的几何特征归类,比按行业归类靠谱得多。

缺陷/目标特征几何本质首选光型备选说明
印刷字符、条码、颜色分区反射率差异明场(同轴光/穹顶光)环形光直打靠反射率差,明场效率最高
高反表面上的浅划痕微米级散射暗场(低角度环)暗场环、偏振明场明场下几乎不可见
透明件内部裂纹、气泡折射率突变暗场背光+偏振散射信号强,暗场首选
尺寸、轮廓、孔径遮挡背光(透射明场)同轴光远心剪影边缘锐利,亚像素精度高
平面度、翘曲反射方向变化明场+结构化光栅暗场靠反射条纹形变判断
毛刺、翻边、凸起边缘散射+遮挡暗场+低角度侧光明场侧光侧光造阴影,暗场抓边缘
深孔内壁、螺纹内部反射同轴光/内窥式多角度环光需要光能进得去
表面粗糙度、喷砂均匀性散射强度暗场(大角度)明场+漫射粗糙度直接调制散射强度

4.2 组合光型与分时曝光

单一光型搞不定的情况太常见了。最典型的是“表面有纹理又要有缺陷”——纹理是镜面反射,缺陷是散射,一个明场一个暗场,物理上就是两条通道。这时候有两条路:一是空间上分开,用两种光源从不同方向打,颜色不同、波长不同,用彩色相机分开通道;二是时间上分开,两种光型分时曝光,各出一张图,算法融合。

时间分开对光源控制器的同步要求高,但图像质量可控。我做过一版方案,明场曝光 300 μs、暗场曝光 2 ms,两张图相差 6 倍曝光,用两路触发分别控制,各自独立调参,出来的两张图分别做不同的检测,比强行用一张图兼顾要稳得多。代价是节拍降了一半,得跟产线确认能不能接受。

空间分开的话,用不同波长是个巧办法。红色低角度环做暗场、蓝色同轴做明场,彩色相机一拍两得,单次曝光同时拿到两个通道。缺点是像素带了彩色滤镜,分辨率和灵敏度都要打折扣,暗场信号本来就弱,再被滤掉一大半,很容易不够用。

4.3 一套可复现的调试流程

我把调试过程固定成六步,每次新项目都按这个走,能省掉大量来回。

  1. 估算像素当量:先算出能不能看清目标特征,像素当量至少要做到特征尺寸的三分之一,能做到五分之一更好。
  2. 确定景深:把工件高度公差代进景深公式,判断需不需要远心或者自动对焦。
  3. 明场初打:先用同轴光或穹顶光把表面整体照清楚,确认视场、对焦、均匀性没问题,这是基准图。
  4. 切暗场试探:保持相机参数不变,换上低角度环,从 30° 开始往下压,每 5° 拍一张,找背景最暗的那张。
  5. 双图对比定方案:把明场图和暗场图放在一起看,缺陷在哪张图上更清楚,就说明它的物理属性属于哪一类,方案方向就定了。
  6. 参数固化:把光源型号、安装角度、安装高度、工作距离、镜头光圈、曝光时间、增益、白平衡全部记录成表,附在方案文档里。

第六步最容易被忽略,也最要命。同一个方案,换个人来调,光源高度差 10 mm、光圈差一档,出来的图可能就完全不同。我见过一个项目因为调试参数没记录,产线换了工装之后复现不出来,最后重新调了两个星期。

5. 现场问题排查实录

5.1 明场问题的速查与处置

现象可能原因处置
图像整体发灰、对比度低杂散光、镜头脏、光源过曝加遮光筒、清洁镜头、降功率或缩光圈
中心亮边缘暗光源覆盖不足、安装太低抬高光源、换大面积穹顶光
反光斑随工件移动曲面镜面反射改漫射照明或加偏振
图像有彩色条纹光源频闪与相机曝光不同步用恒流驱动或加大曝光,避开频闪
明场下看不到缺陷缺陷属于散射型换暗场,不要硬调参数
灰度随批次漂移白平衡未锁定、光源老化锁定白平衡、换新光源、加参考白板

明场里我最常处理的是“杂散光”。产线上一个明显的例子:机台旁边有一扇窗,下午阳光角度变化,图像灰度跟着慢慢变,算法阈值失效。加了一圈黑色遮光板之后,问题消失。这件事不难解决,但没人愿意承认问题出在环境光上,都在算法里加自适应阈值,越加越复杂。

5.2 暗场问题的速查与处置

现象可能原因处置
背景不黑,整体发灰环境漏光、光源角度不够遮光、降低入射角(更贴近表面)
缺陷亮度不均,中心亮边缘暗视场边缘入射角偏小换大尺寸暗场环、加辅助侧光
图像噪声大、颗粒感重曝光不足、增益开太高加曝光、降增益、提高光源功率
灰尘、指纹成了主要信号暗场对散射体极度敏感提高清洁度、吹气除尘、增加预处理
缺陷随工件浮动时隐时现工件高度变化改变了入射角稳定定心、改同轴暗场
同一缺陷忽明忽暗光源频闪或驱动不稳恒流驱动、加大曝光

暗场最让人头疼的不是调不出来,是太灵敏。有一次在半自动工位上做玻璃边缘微裂纹检测,暗场一出图,好家伙,整个视野里全是亮点——灰尘、擦痕、水渍、工人指纹,全在发光,裂纹反而找不着了。最后做三件事:工位加装吹气嘴,检测前吹一次;镜头加深遮光筒隔绝斜向杂光;算法上加一层形态学过滤,把小于 5 个像素的孤立点先剔掉。三招下来信噪比才够用。这件事之后我形成了一个习惯:做暗场方案,清洁度要当成设计输入,不能当成现场条件。

5.3 几条踩过坑才愿意相信的经验

第一条,别指望先定相机再定光。光的物理限定是硬的,相机的参数是软的。一个只能靠散射成像的缺陷,用再好的相机配明场也拍不出来;反过来,暗场下背景干净了,哪怕用一台普通工业相机,信噪比也够。顺序应该是缺陷物理属性 → 光型 → 镜头 → 相机。

第二条,暗场的曝光余量要留够。明场下曝光调低一点还能靠增益补,暗场增益一开高,噪声立刻上来,图像看着亮其实是噪点。我一般要求暗场方案在正常曝光下,目标区域的灰度能达到相机满量程的 40% 以上,留出足够的余量应对光源老化。达不到就换更强的光或者更大的靶面,别在增益上找补。

第三条,光源的角度比功率重要十倍。同样一个 10 W 的环形光,角度调对和调错,出来的暗场对比度能差十几倍。调机的时候宁可多花半小时转角度,也别急着上更大功率的灯。

第四条,把明场图存成基准。每换一次工装、每调一次光,先拍一张明场基准图存着。后面暗场出问题的时候,拿基准图一比,就能快速判断是光源的事还是工件的事。这个习惯帮我省过好几次排查时间。

第五条,小心“看起来很好”的图。暗场调得好,图像会非常漂亮,缺陷亮得刺眼,很容易让人忽略它其实不稳定。判断一套暗场方案行不行,得连续拍一百张,看缺陷灰度的波动范围。波动超过 20% 就得回头查光源驱动和机构稳定性,别被第一张图骗了。

最后分享一个小技巧,调暗场入射角的时候,我会在工件位置放一张白纸,从侧面用肉眼观察光源在白纸上的投射形状——如果能看到一条锐利的亮带贴着纸面掠过去,说明角度压到位了;如果看到的是一片模糊的亮斑,那就是入射角还太大。这个动作比反复拍图快得多,尤其是现场没有实时直方图工具的时候,肉眼看一眼就能定个大概方向,后面再微调。

光学成像这件事,说到底是在跟光的传播方向较劲,明场管的是反射方向,暗场管的是散射方向,把这套几何关系在脑子里立起来,选型、调试、排查就有了一条共同的主线,剩下的就是耐心在现场一遍遍地试。