颜色识别/颜色控件转换
VM / VPP 对照
| VM / VPP 操作 | Halcon 算子链 | 核心区别 |
|---|---|---|
拖"颜色识别"工具 → 选颜色空间 → 选颜色 → 输出 |
decompose3 → trans_from_rgb → threshold |
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)。分离后的通道可单独进行阈值分割、滤波等处理。
注意: 工业相机采集的图像通道顺序可能是RGB或BGR,需根据相机参数确认。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筛选各颜色区域。