ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LabVIEW工业表面缺陷识别源码:划痕与脏点分类检测方案

LabVIEW工业表面缺陷识别源码:划痕与脏点分类检测方案 简介这是一套基于 LabVIEW 开发的工业产品表面缺陷识别源码包面向自动化工程师与机器视觉初学者解决产线中划痕、污点、裂纹、缺损等常见缺陷的实时检测与定位问题。资源共 15 个文件约 890KB包含可直接运行的 LabVIEW 工程说明HTML/TXT 格式、4 张典型缺陷样本图像以及多份技术文档覆盖图像采集、预处理、特征提取、判定逻辑全流程并重点阐述边缘检测算法在 NI Vision 模块中的落地实现。目前已有 28 人学习下载。读者可获得完整源码思路、样本图像与配套原理分析无需依赖高级 AI 框架即可快速完成二次开发或产线集成对掌握 LabVIEW 视觉检测项目具有实际参考价值。 我在产线调试LabVIEW视觉程序时最常遇到的情况就是老板指着屏幕上那些密密麻麻的检测框问这玩意儿能不能分清楚划痕和脏点能不能稳定跑一整天不误报说实话很多做机器视觉的工程师C和Halcon玩得很溜但到了LabVIEW平台上面对VDM模块一堆图像处理函数时反而不知道怎么组织一个完整的缺陷识别流程。这套源码包就是干这个用的——把工业表面缺陷识别这件事从图像采集、预处理、缺陷分割、特征提取到最终分类判断全部在LabVIEW环境下跑通配上实际产线的图像示例和一本拿过来就能照着配环境的文档。你不用从零研究灰度阈值的坑也不用纠结粒度分析选哪个参数直接改改配置就能在自己的项目里跑起来。1. 为什么选LabVIEW做表面缺陷识别而不是C或Halcon这个问题的答案只有真正在工厂里待过、被交付周期和现场调试折磨过的人才会懂。表面缺陷识别听起来是个纯算法问题但落到工业现场它首先是工程问题。用C写一套完整的视觉检测程序就算你代码能力很强从采集驱动适配、界面编写到算法验证少说也要两三周。而LabVIEW加VDM模块的路线把底层驱动和图像处理算子都封装成了图形化模块我可以在半天内搭出采集到显示的通路两天内把缺陷识别的核心逻辑跑出效果。它的优势不是算法性能而是系统的整体效率。具体到源码包选择的视觉方案我走的是典型的LabVIEW机器视觉框架关键模块包括图像采集通过NI-IMAQdx驱动连接GigE或USB相机支持Snap单帧和Grab连续两种模式对应产线上的定位拍照和在线检测。图像预处理调用IMAQ Extract、IMAQ Threshold、IMAQ Morphology等函数解决图像噪声、光照不均和目标分割问题。缺陷分析使用IMAQ Particle Filter和IMAQ Caliper对分割出的缺陷粒子做面积、周长、圆度等特征计算最终输出OK或NG判断。结果显示与记录在VI前面板用Overlay绘制检测框与缺陷位置标记同时记录检测结果和图像到本地路径方便追溯。如果你之前只在LabVIEW里做过数据采集没接触过视觉模块也没关系。这套源码包的代码组织方式就是为复用设计的你在自己的项目里只需要替换采集设备的参数和检测指标的阈值其他逻辑可以直接沿用。后面第3部分我会把核心模块逐一拆开讲。2. 表面缺陷检测的底层图像逻辑先搞明白这几个环节很多人在LabVIEW里做缺陷识别一上来就调Threshold二值化结果现场一跑全是误检。核心原因是没有理解一个完整的视觉检测系统每一步的输入输出到底是什么。我通常把流程拆成四个环节采集与标定、预处理、缺陷分割与特征提取、分类判断。2.1 采集环节决定了后续所有算法的上限采集这一步最重要的不是分辨率而是成像质量。工业现场的金属垫片表面划痕、注塑件缺料、PCB板脏污如果你用普通背光或者环境光照明图像对比度不够后面算法再怎么写都白搭。我建议用低角度环形光源加同轴光组合让缺陷边缘产生明显的灰度跳变。相机选型上检测精度要求0.1mm的缺陷对应视野内至少要有2到3个像素否则特征提取阶段面积和圆度根本算不准。源码包里包含了环形光源和条形光源两种打光方式下的采集示例图你可以直观看到相同算法在不同光照下效果差异有多大。这是一张非常省时间的参考对照表。2.2 预处理不是玄学是为分割做减法很多教程爱把预处理说得特别玄什么滤波、增强、形态学变换一堆名词。其实在缺陷检测里预处理的本质就一句话让想检测的东西更明显让干扰的东西更弱。具体到LabVIEW的VDM我常用的组合是先做一次高斯滤波或中值滤波目的是去掉传感器热噪声和表面反光造成的椒盐噪点。滤波器尺寸我一般取3x3或5x5太大会把细微划痕都抹平。如果整体灰度偏高或偏低用IMAQ Brightness或Equalize做灰度拉伸让缺陷和背景的对比度拉开。对于背景有纹理干扰的情况可以考虑FFT滤波把周期性纹理频率滤掉这是处理金属拉丝表面划痕检测的关键技巧。预处理完用Image Browser看看直方图你会发现原本一团模糊的灰度分布被拉开成几个明显的峰这就是进入缺陷分割的好时机。2.3 分割的本质把可疑区域从图像里切出来LabVIEW里最常用的是全局阈值IMAQ Threshold和局部自适应阈值IMAQ LocalThreshold。我的经验是如果光源稳定、亮场暗场对比明确全局阈值就足够了参数设置也简单。但碰上光照不均的情况局部自适应阈值的效果会好很多它根据每个像素周围邻域的灰度均值动态决定阈值代价是计算量大一些但对产线上光源衰减、环境光变化不那么敏感。分割完成后通常还会接着做一次形态学开闭运算——开运算去孤立小噪点闭运算填补缺陷内部的小空洞。这一步做完缺陷粒子基本就完整呈现在二值图上了。2.4 特征提取带来真正可量化的判断依据分割出可疑区域后不能直接说这就是缺陷。LabVIEW的IMAQ Particle Analysis会算出每个粒子的面积、周长、质心坐标、圆度Circularity、伸长度Elongation等几十个特征值。这些数字才是你判断缺陷类型的依据。比如划痕的伸长度通常大于2.5圆度接近0而圆形凹坑的圆度接近1伸长度接近1。所以源码包里的分类逻辑不依赖高大上的深度学习模型就是基于这些几何特征的规则判断。简单但解释性强——现场维护人员能很容易理解为什么这块产品被判定为NG而不是面对一个黑盒模型无从下手。3. 核心代码模块拆解从采集到判定的完整LabVIEW实现这套源码包里的程序不是单一大VI我按功能拆成了多个子VI。这样做的好处是你可以只替换某个环节而不影响整体逻辑也方便调试。下面按实际运行的顺序把每个核心模块的设计思路和参数配置讲清楚。3.1 图像采集子VI的配置细节采集子VI里封装了IMAQdx Session的打开、属性配置、单帧/连续采集和关闭。属性配置里我最常调整的几个参数是曝光时间、增益和触发模式。注意触发模式对产线检测特别关键——普通USB相机用的软触发延迟有几十到几百毫秒跑低速产线没问题一旦节拍要求到每秒两三个产品必须用硬件触发。如果相机支持外触发信号输入建议把Trigger Mode设为硬触发由PLC给脉冲信号相机只在需要时采集既保证图像位置稳定又省掉不少CPU开销。曝光时间的选择我一般先把增益调到最低然后手动调节曝光直到图像亮度适中、缺陷对比度最好。自动曝光功能我建议在产线上关掉否则光源衰减或反光变化时程序会自动调整曝光参数图像灰度跟着变你的二值化阈值全得重调。这是现场稳定性最容易翻车的点源码包的图像采集子VI默认关闭自动曝光还配了详细说明。3.2 预处理子VI的参数设置建议预处理子VI做三件事转灰度、滤波去噪、形态学处理。用IMAQ ExtractSingleColor提取灰度平面然后用IMAQ Filter的中值滤波选项。中值滤波对椒盐噪声的抑制能力比均值滤波好还能保留边缘细节我默认用3x3核。如果图像本身比较干净滤波这步可以跳过度时如果噪声点密集优先加大滤波核而不是调阈值否则很容易把噪声也归为缺陷。形态学处理时开运算我习惯用3x3的方形结构元素迭代次数在1到3之间。迭代太多会直接把细小划痕抹掉。闭运算也同理目的是把缺陷内部因为灰度不均导致的空洞填上但不是把你需要数出来的特征给糊平。这几个参数放在前面板上方便你在调试时拖动滑杆实时观察效果。3.3 缺陷分割与粒子筛选分割环节用了IMAQ Threshold加IMAQ Particle Filter的组合。Threshold的区间需要根据你的打光方式定暗场下缺陷是暗斑就选灰度小于阈值亮场下缺陷是亮斑就选大于阈值。这个很容易搞反文档里专门写了判断方法用Image Browser查看目标区域的灰度值范围把鼠标放到缺陷位置读取像素灰度再和正常区域对比你就知道该选哪个方向。Particle Filter是这个源码包算法的核心我在里面设置了三道特征门限面积范围、圆度范围、伸长度范围。面积的上下限用来排除碎屑或大面积反光干扰圆度和伸长度用来区分缺陷类型。这三道门限组合起来误判率能压到很低。你也可以根据自己的样品在VI前面板直接修改这些特征值立即看到筛选结果变化。分类输出子VI在判定为NG时会在图像上画红色框标记缺陷位置在OK区域画绿色框。同时记录检测结果的字符串和产品编号方便后续追溯。如果你希望结果传到PLC这里预留了共享变量或网络流接口改动量不大。4. 现场运行踩过的坑比成功案例更值得看源码包里的功能没问题但在真正的产线上跑起来总有文档里不写、只有实际用过的才懂的坑。我把几个典型问题写在这里算是经验之谈。4.1 光照一致性最大误报来源产线光源用久了会老化衰减或者操作工调整了工装位置导致图像整体灰度偏移。这种情况最阴险——程序没有任何报错但开机一小时后NG率开始悄悄上升。我在源码包里特意把检测结果和实时图像都保存到本地磁盘发现误报增多时第一件事不是改算法而是回看NG图片看灰度直方图是不是整体漂了。如果确实是光源问题优先调节光源亮度和高度保持图像中缺陷与背景的对比度稳定。源码包的图像示例里专门放了一组光源亮度变化前后的对比图直观展示同参数下检测效果的差异。4.2 相机的丢帧与内存泄漏用Grab模式连续采集时如果程序处理一帧的时间超过相机帧间隔输入队列会堆积最终导致图像延迟或丢帧。我在采集子VI里做了帧率统计检测耗时可以通过前面板的计时器看到。如果处理太慢改变策略把图像缩小到ROI区域再处理或者把相机帧率降到实际需要值。另一个容易踩的是内存问题LabVIEW里每次循环都创建新Image并释放大量图像数据会造成系统内存碎片化长时间跑下来程序越来越卡。解决方法是循环外创建Image引用循环内复用同一块内存帧间图像数据直接覆盖写。这个优化在源码包里已经做了建议不要去掉。4.3 误杀与漏放的平衡参数怎么调表面缺陷识别最怕的是过杀——把合格品判成NG以及漏放——问题产品流到下游。这两个指标在算法层面是矛盾的。面积阈值放宽漏放减少但过杀掉高阈值收紧则反过来。我的经验是按产品实际缺陷统计分布来设定先从正常品和缺陷品图像中提取特征画出面积和圆度的分布范围然后取两个分布之间相对安全区域作为阈值。源码包的Particle Filter默认参数是按垫片类金属件设置的你换产品时建议重新做一次特征统计再调整直接沿用会出问题。5. 源码包里都有什么整理给你的快速上手路径拿到源码包后别急着写自己的VI先按下面顺序把基础环境确认好。5.1 环境与版本要求源码包基于LabVIEW 2018及以上版本开发视觉相关功能依赖NI Vision Development Module。版本过低会导致VI打开报错主要是部分函数在不同版本的内部接口有变动。建议直接装LabVIEW 2020或2021VDM用对应的同一版本兼容性问题最少。硬件方面图像采集使用GigE Vision或USB3 Vision相机驱动装NI-IMAQdx。源码包里附带了应用说明文档环境变量、驱动安装步骤、许可注意事项都有写照着来就行。5.2 文件目录的组织逻辑目录分三层。第一层是主VI和启动入口双击即可运行完整检测流程。第二层是子VI对应采集、预处理、分割、分类等每个环节命名规则是功能加版本号例如PreProcess_V1.0.vi。第三层是图像示例目录包含OK样本、NG样本分划痕、凹坑、脏污等典型缺陷以及不同光照条件下的对照图共几十张。这些示例图另外还有对应原始图片与处理后的标注结果图方便你理解每个模块的实际作用和效果。5.3 像改配置参数一样适配你的产品整个源码包的设计目标就是不改代码也能用。你要换被测产品时按以下步骤操作即可打开ImageBrowser载入你产品的图像确认采集图像质量调打光角度与亮度保证目标区域与背景对比度清晰在预处理子VI前面板调整滤波器核大小与形态学迭代次数在Particle Filter设置面积、圆度、伸长度阈值的范围观察筛选结果最后在主VI前面板设置保存路径、产品批次号和触发模式。全部改完运行一遍观察30到50个样品微调阈值。如果检测目标不止一种可以保存多组配置为配置文件运行程序时按产品型号自动加载对应配置。这个方案实现起来也很简单LabVIEW读写配置文件本身就非常方便我在源码包文档里也给了扩展思路。6. 从这套源码包继续扩展的方向如果你把基础检测流程跑通了想在功能上继续提升有两个方向值得展开。第一个方向是增加缺陷分类的细分能力。目前源码包用粒子特征做规则判断能区分划痕、凹坑等形状差异明显的缺陷。如果想进一步区分同形状但不同严重程度的缺陷可以增加特征维度比如灰度均值、灰度标准差代表缺陷区域的深浅或密度变化。提取更多特征后配合IMAQ Train Classifier训练一个简单的分类器识别能力会强很多。第二个方向是统计过程控制和数据追溯。你可以在现有检测循环里把每个产品的检测结果、缺陷面积、缺陷位置全部记录到数据库生成趋势报表。哪天某批产品频繁出现同一种缺陷说明上游工艺参数变了可以反向追溯。这个扩展在LabVIEW里通过报表生成工具包或文件写入函数就能实现。检测数据导出的功能源码包目前已经预留了保存接口往里填充内容即可完成完整商业系统。我个人的经验是一套视觉检测程序能稳定跑半年靠的不是算法有多新而是工程边界是否清楚——光照变了怎么办、产品型号切换怎么办、误报了怎么查。这套源码包把这些边界都考虑进去了你后续改造成自己的方案时也建议把现场运行的数据和图像积累下来把问题消灭在算法之外的地方。等你积累的样本多了阈值设置会越来越自信产线维护人员也会有据可查这才是机器视觉项目长久稳定的关键。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进