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. 实战技巧与性能优化批量处理优化* 使用循环处理多个图像 for Index : 1 to 100 by 1 read_image(Image, dataset/raw/image_ Index$02d) * 处理流程... endfor内存管理* 及时清除不再需要的对象 clear_obj(ManualRegion) clear_obj(TempMask)质量检查* 叠加显示检查 dev_display(Image) dev_set_color(red) dev_set_draw(margin) dev_display(ManualRegion)参数化配置* 使用变量存储配置参数 EdgeWidth : 3.0 ClassColors : [[255,0,0], [0,255,0], [0,0,255]]通过本文介绍的方法您可以高效地为工业视觉项目生成高质量的标注数据。在实际应用中根据具体需求调整参数和流程可以显著提升深度学习模型的训练效果。