Halcon 22.05 图像标注实战:paint_region() 生成3类分割掩码图

📅 2026/7/5 4:17:25 👁️ 阅读次数 📝 编程学习
Halcon 22.05 图像标注实战:paint_region() 生成3类分割掩码图

Halcon 22.05 图像标注实战:paint_region() 生成3类分割掩码图

在工业视觉项目中,为深度学习模型准备高质量的标注数据是至关重要的环节。本文将深入探讨如何利用Halcon 22.05中的paint_region()算子,从交互式绘制的Region或阈值分割得到的Region生成单通道灰度掩码图和三通道彩色掩码图,并解决高分辨率图像下边缘过细的常见问题。

1. 掩码图生成基础原理

掩码图(Mask Image)在计算机视觉中用于标识图像中特定区域的位置。在语义分割任务中,掩码图的每个像素值代表其所属的类别。Halcon提供了多种方式生成掩码图,其中paint_region()是最灵活的方法之一。

paint_region()算子的核心参数包括:

  • Region:待绘制的区域,可以是单个Region或Region数组
  • Image:输入图像,决定输出图像的尺寸和通道数
  • Grayval:绘制区域的灰度值(单通道)或RGB值(三通道)
  • Type:绘制类型,'fill'表示填充整个区域,'margin'表示只绘制边缘
* 基本用法示例 read_image(Image, 'particle.png') threshold(Image, Regions, 128, 255) paint_region(Regions, Image, MaskImage, 255, 'fill')

2. 单通道与三通道掩码生成

2.1 单通道灰度掩码

单通道掩码是最简单的形式,通常用于二分类问题。每个像素值为0(背景)或特定灰度值(前景)。

* 生成单通道掩码 read_image(Image, 'chip.png') rgb1_to_gray(Image, GrayImage) threshold(GrayImage, Regions, 100, 200) paint_region(Regions, GrayImage, GrayMask, 255, 'fill')

对于多类别分割,可以为不同类别分配不同的灰度值:

* 多类别单通道掩码 connection(Regions, ConnectedRegions) select_shape(ConnectedRegions, Class1, 'area', 'and', 100, 500) select_shape(ConnectedRegions, Class2, 'area', 'and', 501, 1000) paint_region(Class1, GrayImage, TempMask1, 100, 'fill') paint_region(Class2, TempMask1, FinalMask, 200, 'fill')

2.2 三通道彩色掩码

三通道掩码更直观,适合可视化检查。每个通道可以代表不同类别或属性。

* 生成三通道彩色掩码 gen_image_const(RedChannel, 'byte', Width, Height) gen_image_const(GreenChannel, 'byte', Width, Height) gen_image_const(BlueChannel, 'byte', Width, Height) * 为不同类别设置不同颜色 paint_region(Class1, RedChannel, RedMask, 255, 'fill') * 红色 paint_region(Class2, GreenChannel, GreenMask, 255, 'fill') * 绿色 paint_region(Class3, BlueChannel, BlueMask, 255, 'fill') * 蓝色 compose3(RedMask, GreenMask, BlueMask, ColorMask)

3. 高分辨率图像边缘处理技巧

使用'margin'模式时,默认边缘宽度为1像素,在高分辨率图像中可能难以辨认。以下是两种解决方案:

3.1 区域膨胀法

在绘制前对Region进行膨胀操作,增加边缘宽度:

* 边缘膨胀处理 dilation_circle(Regions, ExpandedRegions, 3.5) * 3.5像素半径 paint_region(ExpandedRegions, Image, MaskImage, [255,0,0], 'margin')

3.2 多重绘制法

通过多次绘制不同大小的Region来创建更明显的边缘:

* 多重绘制创建宽边缘 dilation_circle(Regions, InnerEdge, 1.5) dilation_circle(Regions, OuterEdge, 3.0) difference(OuterEdge, InnerEdge, EdgeRing) paint_region(EdgeRing, Image, MaskImage, [255,0,0], 'fill')

4. 完整的数据集生成流程

以下是一个完整的HDevelop脚本示例,演示如何从原始图像生成掩码并保存为数据集:

* 1. 初始化 dev_update_off() read_image(Image, 'industrial_part_01.png') get_image_size(Image, Width, Height) * 2. 交互式标注或自动分割 dev_open_window(0, 0, Width, Height, 'black', WindowHandle) dev_display(Image) draw_region(ManualRegion, WindowHandle) * 交互式绘制 * 或使用自动分割: * threshold(Image, AutoRegion, 100, 200) * 3. 生成单通道掩码 gen_image_const(EmptyImage, 'byte', Width, Height) paint_region(ManualRegion, EmptyImage, GrayMask, 255, 'fill') * 4. 生成三通道彩色掩码 gen_image_const(RedChannel, 'byte', Width, Height) gen_image_const(GreenChannel, 'byte', Width, Height) gen_image_const(BlueChannel, 'byte', Width, Height) paint_region(ManualRegion, RedChannel, RedMask, 255, 'fill') paint_region(ManualRegion, GreenChannel, GreenMask, 0, 'fill') paint_region(ManualRegion, BlueChannel, BlueMask, 0, 'fill') compose3(RedMask, GreenMask, BlueMask, ColorMask) * 5. 解决高分辨率边缘问题 dilation_circle(ManualRegion, ExpandedRegion, 2.5) paint_region(ExpandedRegion, EmptyImage, ThickEdgeMask, 255, 'margin') * 6. 保存结果 write_image(Image, 'png', 0, 'dataset/images/part_01.png') write_image(GrayMask, 'png', 0, 'dataset/masks/gray/part_01.png') write_image(ColorMask, 'png', 0, 'dataset/masks/color/part_01.png') write_image(ThickEdgeMask, 'png', 0, 'dataset/masks/edges/part_01.png')

5. 实战技巧与性能优化

  1. 批量处理优化

    * 使用循环处理多个图像 for Index := 1 to 100 by 1 read_image(Image, 'dataset/raw/image_' + Index$'02d') * 处理流程... endfor
  2. 内存管理

    * 及时清除不再需要的对象 clear_obj(ManualRegion) clear_obj(TempMask)
  3. 质量检查

    * 叠加显示检查 dev_display(Image) dev_set_color('red') dev_set_draw('margin') dev_display(ManualRegion)
  4. 参数化配置

    * 使用变量存储配置参数 EdgeWidth := 3.0 ClassColors := [[255,0,0], [0,255,0], [0,0,255]]

通过本文介绍的方法,您可以高效地为工业视觉项目生成高质量的标注数据。在实际应用中,根据具体需求调整参数和流程,可以显著提升深度学习模型的训练效果。