halcon核心-颜色识别/颜色控件转换(十)

颜色识别/颜色控件转换

VM / VPP 对照

VM / VPP 操作 Halcon 算子链 核心区别
"颜色识别"工具 → 选颜色空间 → 选颜色 → 输出 decompose3trans_from_rgbthreshold Halcon 需要你自己分解通道并选择阈值,没有现成的颜色选择器

万能算子链

markdown 复制代码
* 步骤1: 通道分解
decompose3 (Image, R, G, B)
* 步骤2: RGB转HSV
trans_from_rgb (R, G, B, H, S, V, 'hsv')
* 步骤3: 色相阈值分割
threshold (H, RegionRed, 0, 20)
* 步骤4: 饱和度阈值分割
threshold (S, RegionSat, 100, 255)
* 步骤5: 区域交集
intersection (RegionRed, RegionSat, RegionRedFinal)

🔬 算子参数详解与原理

核心思路: 颜色识别的本质是"在合适的颜色空间做阈值分割"RGB颜色空间中亮度和色度耦合,同一颜色在不同光照下RGB值变化大;HSV/HIS颜色空间将亮度(V/I)色调(H)饱和度(S)分离,使颜色判定对光照变化更鲁棒。通过将图像转换到HSV空间,在H-S平面做阈值分割,即可稳定提取目标颜色区域。VM/VPP将颜色空间转换和阈值封装为颜色工具,而Halcon需要显式进行通道分解、空间转换和联合阈值,灵活性更高,支持自定义颜色空间。

算子 VM / VPP 对应操作 核心作用
decompose3 颜色工具 → 通道分解 → RGB分离 将3通道彩色图像分解为R、G、B三个单通道灰度图像
trans_from_rgb 颜色工具 → 颜色空间转换 → RGB转HSV 将RGB图像转换到HSV/HIS/YCbCr等其他颜色空间
threshold 颜色工具 → 颜色阈值 → H/S/V范围设置 在HSV各通道上分别做阈值分割,提取目标颜色区域
intersection 颜色工具 → 区域交集 → 联合筛选 将H、S、V三个通道的阈值结果取交集,得到精确的目标颜色区域

① decompose3 --- RGB通道分解

scss 复制代码
decompose3 (Image, ImageR, ImageG, ImageB)

参数说明:

Image (输入): 3通道RGB彩色图像。

ImageR (输出): 红色通道灰度图像。

ImageG (输出): 绿色通道灰度图像。

ImageB (输出): 蓝色通道灰度图像。

工作原理: 将RGB彩色图像的三个通道分离为独立的单通道图像。每个通道图像的像素值表示该颜色分量的强度(0~255)。分离后的通道可单独进行阈值分割、滤波等处理。

注意: 工业相机采集的图像通道顺序可能是RGBBGR,需根据相机参数确认。decompose3按Halcon内部存储顺序分解,通常是RGB。如果需要在RGB空间直接做颜色分割(如"红色物体"=R高且G/B低),可对三个通道分别threshold后用intersection联合。

② trans_from_rgb --- 颜色空间转换

arduino 复制代码
trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')

参数说明:

ImageR, ImageG, ImageB (输入): RGB三个通道图像。

ImageH (输出): 色调通道。H∈0,255,对应色相0°~360° (红色=0/255,绿色=85,蓝色=170)。 ImageS (输出): 饱和度通道。S∈0,255,值越大颜色越鲜艳,灰色/白色的S接近0。

ImageV (输出): 明度通道。V∈0,255,表示亮度,与RGB中的最大值相关。

'hsv' (ColorSpace): 目标颜色空间。可选:

  • 'hsv': 色调-饱和度-明度(最常用)

  • 'hsi': 色调-饱和度-强度

  • 'yuv': YUV电视信号空间

  • 'ycbcr': YCbCr数字视频空间

  • 'ciexyz'/'cielab': CIE标准色度空间(与人眼感知一致)

工作原理: HSV颜色空间将颜色表示为圆柱坐标系:H为角度(色相)S为半径(饱和度)V为高度(明度)。转换公式(简化):V = max(R,G,B); S = (V-min(R,G,B))/V(若V>0);H根据RGB的相对大小计算角度。HSV的关键优势是H通道与亮度V基本解耦------同一颜色在不同光照下V变化大,但H基本不变。因此只需在H-S平面设定稳定的阈值范围,即可实现光照鲁棒的颜色分割。

关键技巧: 红色在H通道跨越0°/360°边界(H=0和H=255都是红色),因此红色阈值需用union合并两个区间:threshold(H, Red1, 0, 15) threshold(H, Red2, 240, 255)。

③ threshold + intersection --- HSV联合阈值分割

scss 复制代码
threshold (ImageH, RegionH, 0, 15)
threshold (ImageS, RegionS, 80, 255)
threshold (ImageV, RegionV, 50, 255)
intersection (RegionH, RegionS, RegionHS)
intersection (RegionHS, RegionV, RegionColor)

参数说明:

ImageH, ImageS, ImageV (输入): HSV三个通道图像。

RegionH, RegionS, RegionV (输出): 各通道的阈值分割结果。

intersection (算子): 计算两个区域的交集,即同时满足两个条件的像素。

RegionColor (输出): 最终的目标颜色区域。

工作原理: 单独在H通道阈值分割会包含低饱和度的"伪颜色"(接近灰色的区域);单独在S通道阈值会包含所有鲜艳颜色。只有同时满足H在目标色相范围、S足够高(排除灰色)、V在合理亮度范围(排除过暗/过曝),才能精确定位目标颜色。intersection算子执行集合的"与"操作:RegionColor = RegionH ∩ RegionS ∩ RegionV。

工程经验: H阈值范围应尽量窄以提升颜色区分度,但需考虑同色异谱(不同材质相同颜色的H略有差异);S下限通常设为60~100,过滤灰白背景;V下限设为30~50,避免阴影干扰。对于多颜色识别,可对每种颜色分别执行HSV阈值流程,再用connection+select_shape筛选各颜色区域。

相关推荐
SomeB1oody1 小时前
【RustyML入门】5.2. 分类指标
开发语言·后端·机器学习·rust·教程
明月_清风3 小时前
Pi Agent 深度解析:开源极简终端 AI 编码代理的终极指南
前端·后端·ai编程
程序员cxuan3 小时前
DeepSeek Harness 必装的插件公布了!
人工智能·后端·程序员
fatcoder3 小时前
玩转Nginx 03 — location 匹配规则:让不同的路径各回各家
前端·后端·nginx
wno7043 小时前
Spring Boot JdbcTemplate配置Druid多数据源
java·spring boot·后端
月才3 小时前
Spring Boot 接口参数校验从入门到精通
后端
码农大叔的博客3 小时前
golang示例:switch
开发语言·后端·golang
Zane19943 小时前
多开几个线程,为什么算数字反而没变快?一文讲透 CPython 的 GIL
后端·python
一只叫煤球的猫3 小时前
Spring AI 2.0 源码解析(二):Starter 如何自动装配 ChatClient ?
后端·面试·langchain