ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LabVIEW颜色识别实战:HSV空间与NI Vision分类器应用解析

LabVIEW颜色识别实战:HSV空间与NI Vision分类器应用解析 简介LabVIEW 颜色识别示例包定位清晰面向 LabVIEW 入门学习者与机器视觉开发人员演示了从图像采集、颜色空间转换、阈值分割、特征提取到识别输出的完整流程可迁移到工业质检、颜色分选等检测场景。压缩包共 10 个文件主要包含 VI 程序、LVPROJ 工程文件、CLF 调用库文件、VASCR 视觉脚本及 HTML 说明文档整体仅 168KB结构紧凑、便于快速查阅。目前已有 295 人浏览学习。包内除主程序与颜色识别相关子 VI 外还提供示例 GIF 与视觉脚本可直观观察识别效果。使用者可结合说明文档修改颜色阈值与空间参数逐步掌握 RGB、HSV 等颜色空间的选择与阈值调试方法借助示例工程的清晰目录结构也能快速将颜色识别逻辑移植到自己的检测项目中并在现有工程基础上继续扩展功能。1. LabVIEW中的颜色识别难点从来不在写代码而在颜色空间选型把红绿两个颜色的接线端子分开是很多视觉项目的入门第一课。LabVIEW做颜色识别时最容易翻车的恰好不是框图逻辑而是直接用RGB空间去做阈值分割——现场灯光稍微变一下红色就偏成了橙色于是误判率直接失控。这套vision.rar工程走的是另一条路先把图像从RGB转到HSV空间再结合NI Vision Development Module的颜色分类器对应包里的color.vascr和color.clf完成识别。它不需要你从头写机器学习模型训练十几张现场样本就能得到可用的分类结果对自动化检测、产品质量分拣这类场景非常实用。适合刚接触IMAQdx采集、还不清楚颜色识别该用哪组函数的读者也适合已经在用模板匹配但被环境光折腾到误判率下不来的工程师——看完你能直接打开工程包按步骤复现。2. 颜色识别原理为什么HSV空间比RGB更适合做阈值分割2.1 灰度图与RGB空间做颜色识别的两个常见误区很多初学者拿到颜色识别任务后第一反应是先把彩色图转成灰度图再做阈值分割。这个方法对黑白字符、二维码这类目标有效但对颜色接近红和绿这种亮度差异不大的情况会直接失效——不同色相在灰度图上可能映射成同一个灰度值后续不管阈值怎么调都分不开。它的本质问题是丢掉了色相信息只保留了亮度。第二个误用是直接在RGB三个通道上分别设阈值。RGB的三个分量受光照强度影响很大同一个红色物体在阴影下是(120, 30, 20)在强光下可能变成(220, 60, 40)三个通道的绝对值全变了。如果按固定阈值分割这两个状态下会得到完全不同的二值结果。工程上更稳的做法是切换颜色空间把“亮度”和“颜色本身”解耦这正是HSV空间存在的意义。2.2 RGB到HSV的转换关系与LabVIEW中Hue平面的编码差异HSV把颜色拆成色相Hue、饱和度Saturation、亮度Value三个分量。转换关系常见写法是import numpy as np def rgb_to_hsv(r, g, b): r, g, b r / 255.0, g / 255.0, b / 255.0 mx, mn max(r, g, b), min(r, g, b) delta mx - mn v mx s 0 if mx 0 else delta / mx if delta 0: h 0 elif mx r: h 60.0 * (((g - b) / delta) % 6) elif mx g: h 60.0 * (((b - r) / delta) 2) else: h 60.0 * (((r - g) / delta) 4) return h, s, v这段代码的价值在于让你理解Hue和亮度分离的原理当delta接近0时说明颜色接近灰色此时Hue本身没有意义当delta较大时Hue对光照强度不敏感因为公式里用的是通道间的差值比例而不是绝对亮度。在LabVIEW里要注意一个编码差异数学上Hue是0到360度的角度值但NI把Hue平面量化成了0到255的整数。也就是说LabVIEW里的Hue255对应360度红色跨在0和255两侧实际调阈值时经常要写两段区间合并这是很多人第一次用IMAQ ColorThreshold时卡住的地方。2.3 颜色距离与最小距离分类器是怎么判断“像不像”的阈值分割适合目标颜色单一的场景但实际产线上的目标往往不是纯色同一个物体上会有渐变、阴影、反光。这时更常用的方式是颜色分类器先给每个颜色类别采集一批样本像素计算每类样本在颜色空间里的均值和方差然后把新像素归类到距离最近的类别。NI的Color Classifier内部用的是马氏距离比欧氏距离多了一步“按方差归一化”能避免某个通道数值波动大导致的距离失真。用Python示意一下这个判定逻辑import numpy as np def mahalanobis_distance(pixel, mean, cov_inv): diff pixel - mean return float(np.sqrt(diff.T cov_inv diff)) # 假设红、绿两类样本已经统计出 mean 和 cov_inv # 新像素归属分别算到两个类别的马氏距离取小者参数含义pixel是HSV三个分量组成的向量mean是这一类训练样本的平均颜色cov_inv是协方差矩阵的逆。马氏距离的工程意义是当某个类别在饱和度方向上波动很大时距离计算会自动降低该方向的权重避免把阴影误判成另一种颜色。2.4 工业场景下颜色空间的选型参考颜色空间适用场景需要注意的问题RGB界面显示、图像保存通道间相关性高光照敏感不适合现场阈值HSV颜色阈值分割、单色目标识别Hue在0/255处有跳变需要处理跨边界区间YCrCb肤色、视频流处理色度分量对荧光灯下的频闪敏感Lab颜色质量检测、色差评价需要标准光源转换计算量略高结论是现场快速调参用HSV颜色品质抽检用Lab。这套vision.rar工程里大量使用HSV阈值加粒子分析配合Color Classifier做多色分类正好覆盖了这两个方向。3. vision.rar工程结构拆解从图像采集到颜色分类的四个关键节点3.1 先看懂工程包里的文件各自干什么打开vision.rar之前先看包里都有什么vision.lvproj是LabVIEW工程文件Main.vi和视觉主程序.vi是主程序vision.lvlps是LabVIEW库文件color.vascr是颜色分类器的训练脚本color.clf是训练好的分类器数据。从lvlps这个文件格式看工程倾向于在LabVIEW 2018之后的版本上创建打开前最好确认本机VDM版本不低于对应版本否则很多视觉函数会报“VI not found”。常见做法是先双击vision.lvproj打开工程再在项目浏览器里定位到Main.vi右键设为启动VI。注意vision.aliases是路径别名文件如果工程打开后提示找不到vi优先检查这个文件里的相对路径是否被改过——把整个rar解压到含中文的深层目录里经常会导致路径别名失效。3.2 图像采集IMAQdx的Snap和Grab不能混用采集分支是整个识别流程的数据源头。NI的视觉采集软件层叫Vision Acquisition Software驱动底层是IMAQdx支持GigE Vision、USB3 Vision两类主流工业相机。需要澄清一个常见混淆VISA通常用于串口和仪器控制图像采集走的是IMAQdx驱动两者不是一回事。排错时如果报错集中在采集端先去看设备管理器里IMAQdx设备是否识别成功而不是去折腾VISA。采集框图用文本形式描述如下// 图像采集分支文本化框图数据流 IMAQdx Open Camera.vi 输入: session in 0, cameraName cam0 输出: session out IMAQdx Grab.vi 输入: session, imageOut 输出: 最新一帧图像 IMAQdx Set Attribute.vi 属性: ATTR_EXPOSURE, ATTR_GAIN, ATTR_WHITE_BALANCE_MODE逻辑说明IMAQdx Open Camera建立相机会话IMAQdx Grab不断拉取最新帧比IMAQdx Snap更适合连续检测循环因为Snap每次重新分配缓冲区帧率上不去。IMAQdx Set Attribute用于固定曝光和增益做颜色识别时这两个参数必须锁死不能开自动曝光。参数说明ATTR_EXPOSURE单位是微秒数值取决于现场亮度和目标运动速度ATTR_GAIN在暗场环境会引入噪声尽量靠补光而不是拉高增益ATTR_WHITE_BALANCE_MODE建议设为manual否则白平衡算法会持续改变RGB通道增益直接导致Hue漂移。3.3 颜色分割与粒子分析从彩色图到二值图的关键转换图像采集进来之后接下来就是在HSV空间做分割。典型框图数据流如下// 颜色分割分支 原始彩色图像 - IMAQ ExtractSingleColorPlane.vi 输入: colorMode HSV 输出: Hue平面图像 - IMAQ ColorThreshold.vi 输入: Hue上界/下界, Saturation范围, Value范围 输出: 二值图像 - IMAQBCParticleAnalysis.vi 输入: 二值图像 输出: Particle数组含Area、CenterOfMass等逻辑说明IMAQ ExtractSingleColorPlane从HSV格式图像里抽出Hue平面然后IMAQ ColorThreshold在Hue平面上做区间分割得到白色前景、黑色背景的二值图。最后IMAQBCParticleAnalysis统计每个连通区域的面积、质心、边界框这些数据就是颜色识别结果的结构化表达。参数说明ColorThreshold的Hue范围要按0到255编码来写红色跨0边界时要用两段范围Saturation下限一般不低于30否则低饱和度的灰色区域会被误当成目标颜色Value下限视打光情况而定过暗的区域没有有效的颜色信息。3.4 用Color Classifier处理多色混杂目标阈值分割解决不了“同一个画面里多种颜色需要同时分类”的问题。color.clf和color.vascr对应的是另一种路径先用NI Vision的Training Interface对每个颜色类别采样训练生成分类器脚本再在运行时用IMAQ ColorClassifier对画面中的每个像素或每个区域进行分类。// 颜色分类分支 IMAQ ColorClassifier Train.vi // 离线训练生成 .clf IMAQ ColorClassifier Classify.vi 输入: 分类器文件路径 输出: 类别索引 置信度逻辑说明训练时每个颜色类别至少采集10张以上现场图像脚本保存为color.vascr分类时传入分类器路径返回类别索引和置信度。置信度低于0.7的结果通常要标记成“待人工确认”这个阈值可以在主程序里用条件结构实现。4. 阈值整定与识别稳定性一张图是怎么被认错的4.1 确定Hue阈值区间的实际操作步骤调阈值不要闭着眼试。NI的VDM自带Color Histogram工具能直接显示整张图像在Hue、Saturation、Value三个平面上的分布曲线。常见做法是先用Color Histogram观察目标区域的颜色分布峰值再回到ColorThreshold里按峰值左右浮动5到10个编码值作为初始区间。下表是常见颜色的Hue参考区间0到255编码实际使用时必须用现场图重新标定目标颜色Hue参考区间边界注意点红色0~10 与 245~255红色跨0边界两段区间需要合并黄色20~35过曝时偏白需要同时限Value绿色40~80暗环境下Hue抖动需收紧S蓝色100~135与青色接近时降低S上限紫色135~165反光面会偏蓝建议加ROI提示Hue区间宁可先紧后松不要一开始就取一个很大的范围否则后续粒子分析阶段会掺入大量背景噪声。4.2 光照与白平衡是颜色识别最大的两个干扰源颜色识别误判的原因排名光照排在第一位。自动曝光开启时相同颜色的物体在亮背景和暗背景下会得到不同的曝光时间导致颜色整体偏移。自动白平衡更严重——它会动态调整RGB通道增益去还原“白色”但目标物体的Hue也随之改变。正确的做法是在IMAQdx Set Attribute里把曝光和增益都设为固定值通过调整光源亮度来适应现场而不是让相机自适应。对于有频闪的荧光灯环境推荐用直流LED光源并把曝光时间设置为工频周期整数倍避免图像亮暗不均。4.3 二值化后的噪声过滤与粒子筛选阈值分割产生的二值图不可能完美背景里跟目标颜色接近的像素会被分割成一个个小连通域。这需要两步处理第一步用形态学操作IMAQ Morphology里的Erode和Open能去掉单个像素大小的孤立点第二步在粒子分析阶段设置面积下限。粒子筛选参数典型设置作用Minimum Area50~100像素过滤微小噪点Maximum Area画面面积的30%排除大面积反光区域Fill HolesTrue让面积计算更接近真实形状4.4 颜色识别误判排查清单现象可能原因处理方向背景被识别为目标颜色阈值范围太宽收紧Hue区间增大Saturation下限识别结果随环境光变化自动曝光或自动白平衡开启固定曝光、增益、白平衡为手动目标颜色太接近无法稳定分类当前用RGB阈值硬切改用HSV空间或Color Classifier分类器训练后现场识别率低训练样本来自非现场环境用实际产线打光条件下的图像重新训练识别框位置漂移粒子面积筛选阈值过小检查最小面积设置和形态学滤波参数// 一个稳定的识别循环结构文本化描述 while (true): Grab 一帧 ExtractSingleColorPlane - HSV ColorThreshold - 二值图 形态学 Open 去噪 ParticleAnalysis 过滤面积 输出颜色索引和坐标这个循环里每个节点的参数如果固定不下来就不要急着优化循环性能先把一组参数在50张不同场景图像上跑通确认无抖动后再固化到主程序里。5. 批量识别与结果记录把颜色分类输出接到生产流程里颜色阈值调稳之后能做的就不只是单张识别了。生产环境下更常见的形态是相机固定不动产品在视野内持续流过程序需要循环抓帧、识别、记录并在不满足条件时报警。LabVIEW里做这种事最顺手的结构是事件循环加队列不丢帧也不阻塞界面。// 批量识别循环文本化事件分支 On Frame Event: IMAQdx Grab - imageOut ColorThreshold ParticleAnalysis - colorIndex FormatIntoString - 写入测量文件 IMAQ Overlay Rectangle - 在结果区域画框我在实际项目里习惯把识别结果拼成一行CSV文本包含时间戳、颜色索引、置信度、粒子面积和质心坐标然后用Write to Measurement File或者文件I/O写入本地。固定格式如下2025-01-15 10:23:01, red, 0.94, 1280, 320, 240 2025-01-15 10:23:02, green, 0.88, 1245, 310, 236时间戳用LabVIEW的Format Date/Time String节点生成颜色索引直接用分类器的类别编号置信度保留两位小数。写到CSV而不是Excel的原因是CSV可以直接用Python或Power BI做后续的良率统计不需要额外的ActiveX调用稳定性和速度都好一截。识别结果除了落盘还应该同步叠加在图像上。IMAQ Overlay Rectangle能在原图上画出识别框和颜色标签方便现场人员目检复核。生产模式下建议把Overlay关掉只在调试界面保留因为显卡绘制会占掉一部分帧间隔。再进一步如果现场有PLC需要根据颜色结果做分拣动作最省事的衔接方式是让LabVIEW通过TCP或Modbus TCP把颜色索引发出去PLC只接收整数不关心图像细节。这样即使识别逻辑在外场调参PLC侧不需要改任何程序。把这个采集、识别、记录、输出的最小循环搭完这套工程包就能从demo变成一条可运行的颜色分选工位。本文还有配套的精品资源点击获取
返回列表