当前位置: 首页 > news >正文

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]]

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

http://www.jsqmd.com/news/1125956/

相关文章:

  • 渗透测试中的权限维持技术:从入门到进阶
  • S7-200 SMART V2.3 运动轴组态:3步完成步进电机点动/定位控制(附程序块)
  • 打印店预约系统-ssm
  • Codex App深度解析:从AI编程助手到并行开发工作流管理
  • 70天冲刺!9月PMP末班车倒计时:这些隐藏规则不知道,可能连考场都进不去
  • 本地AI绘画新利器:Codex与Cowart插件实现无限画布与精准编辑
  • 如何快速部署portal-application-license-monitor:5步完成FlexNet许可证监控配置
  • 平阳室内宴会厅布置攻略
  • Memora:微软给 AI Agent 装上了“不会忘事的大脑”——长期记忆效率提升 98%
  • 夏日清新新色登场!OPPOReno16半夏青开售
  • Claude Mythos Preview 发布后严重漏洞激增:安全还是营销?
  • Keras 2.15 实战:MegaFace 40人数据集CNN人脸识别,验证集准确率达92%
  • 运营负责人视角抖店工具要不要买先看团队每天浪费在哪些重复动作上
  • BMAD Loop:把开发循环的控制权,交还给确定性代码
  • 程序员应知——善于借鉴
  • Kafka Streams 实战:从状态管理到 exactly-once 生产落地
  • Django模板AJAX局部更新实战:零侵入增强交互体验
  • 166、PCIE在Docker容器中的使用:一次真实调试踩坑记
  • JASP:免费开源统计软件如何让数据分析更简单?3大核心功能解析
  • 如何在Linux上使用FSearch实现极速文件搜索:完整效率指南
  • 萌新入坑不用到处找资源!老宅私藏一站式 ACG 社区二次元之家分享
  • AI绘画本地插件部署指南:实现“指哪改哪”的精准图像编辑
  • codex CLI使用技巧
  • 搜维尔科技:Haption力反馈设备远程操作机械臂Tesollo灵巧手
  • 3大核心技术突破:MathLive数学公式编辑器实战指南
  • 成都知名的中央空调公司有哪些
  • Databricks Genie:语义编译器架构与企业级智能解析实践
  • 前端技术29-Tauri实战:Rust后端、Web前端、安全架构完全指南
  • 什么是开放平台
  • 泛程序运营的7个核心要点,落实即可稳步提升收录