HALCON区域运算:connection时机对集合操作的影响
在HALCON视觉库中,connection算子常被通俗理解为"打散"——将不连通的空间区域拆分为独立对象。然而,这个算子在何时调用,会直接影响后续区域集合运算的行为表现。本文通过对比实验,揭示connection执行时机对difference、intersection、union2等算子的深层影响。
一、difference算子的行为差异
1. 多区域对象减去单区域对象
以下示例展示先connection后做差集与先做差集后connection的区别:
read_image (Img, 'test_image.jpg')
* 提取圆形区域
threshold (Img, CircleMask, 0, 80)
opening_circle (CircleMask, CircleClean, 3.5)
* 提取四个独立区块
threshold (Img, BlocksRaw, 100, 200)
opening_circle (BlocksRaw, BlocksClean, 3.5)
* 对圆形区域进行膨胀
dilation_circle (CircleClean, CircleExpanded, 29.5)
* 方案A:先打散再差集
connection (BlocksClean, BlocksSplit)
difference (BlocksSplit, CircleExpanded, ResultA)
area_center (ResultA, AreaA, RowA, ColA)
* 方案B:先差集再打散
difference (BlocksClean, CircleExpanded, TempDiff)
connection (TempDiff, ResultB)
area_center (ResultB, AreaB, RowB, ColB)
实验结果:AreaA为[1307, 4448, 4534, 0],包含4个元素(含一个面积为0的空对象);AreaB为[1307, 4448, 4534],仅3个有效元素。两者视觉形状完全一致,但元组结构截然不同。
2. 多区域集合间的差集运算
当左侧4个区域与右侧2个区域进行difference运算时,结果对象数量保持与第一个参数一致,仍为4个。即使几何上部分区域被完全消除,结果元组中仍会保留对应的空对象占位。
* 左侧4个对象,右侧2个对象
difference (FourParts, TwoParts, DiffResult)
* DiffResult 仍为4个对象,可能包含面积为0的占位项
* 再次执行connection无法消除空对象
connection (DiffResult, Reconnected)
* 结果仍有4个对象
* 需先合并再重新拆分才能清理
union1 (Reconnected, Merged)
connection (Merged, FinalClean)
* FinalClean 变为实际有效区域数量
3. 单区域减去多区域集合
反向操作时,结果对象数量与第一个参数(单区域)保持一致:
* RegionUnion 为5个对象的集合,已执行connection
difference (SingleBlob, RegionUnion, SingleResult)
* 结果仅为1个对象,但可能包含不连通部分
connection (SingleResult, SplitResult)
* SplitResult 变为2个独立对象
difference算子核心规律:运算效果等效于union1(RegionA) - union1(RegionB),但结果元组的元素个数始终与第一个参数RegionA保持一致,可能产生面积为0的占位对象或包含未连通的区域。
二、intersection算子的对称性陷阱
intersection算子虽然满足交换律(几何形状不变),但对象数量受参数顺序影响:
* 准备数据:RegionUnion为5个对象的集合
connection (RegionUnion, RegionUnion)
dilation_circle (CircleClean, CircleDilated, 29.5)
* 顺序A:单区域 intersect 多区域集合
intersection (CircleDilated, RegionUnion, InterA)
* 顺序B:多区域集合 intersect 单区域
intersection (RegionUnion, CircleDilated, InterB)
结果分析:InterA仅含1个对象;InterB含5个对象(含面积为0的占位项)。两者几何形状完全相同,但元组结构差异显著。
三、union2算子的对象数量传递规则
union2(RegionA, RegionB, RegionUnion)的结果对象数量遵循以下规则:
| RegionA对象数 | RegionB对象数 | RegionUnion对象数 | 行为说明 |
|---|---|---|---|
| 1 | 任意 | 1 | RegionB先合并为1个,再与RegionA合并 |
| N | 1 | N | RegionA的每个对象分别与RegionB合并 |
| N | M | N | RegionB先合并为1个,再与RegionA的每个对象合并 |
* 示例:RegionA含2个对象,RegionB含3个对象
union2 (RegionA, RegionB, Combined)
* Combined 含2个对象,每个都是RegionB整体与RegionA对应对象的合并
四、关键结论
这些算子的共同特征是结果对象数量由第一个参数决定,而非几何连通性。理解这一机制对于控制HALCON程序中的元组索引、循环遍历及后续测量分析至关重要。实际开发中,建议在关键运算节点通过count_obj验证对象数量,避免因空对象或拆分时机不当导致的逻辑错误。