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

halcon之第3讲--形态学运算以及Blob 连通域分析

文章目录

    • 前言
    • 形态学运算
      • 膨胀
      • 腐蚀
      • 膨胀腐蚀程序展示
      • 开运算
      • 闭运算
      • 开闭运算程序展示
      • 顶帽
      • 底帽
    • Blob连通域分析

前言

形态学运算

形态学运算是基于图像形状的一组非线性操作,通过结构元素与图像进行卷积,实现膨胀、腐蚀、开闭运算等。常用于图像预处理、去噪、特征提取。

膨胀

dilation_circle(Region : RegionDilation : Radius : )
参数:Region 输入的需要进行膨胀操作的Region ;RegionDilation 是输出的膨胀完成的Region ;由于该算子用圆形卷积核,Radius 是半径大小

  • 膨胀(Dilation):就是求局部最大值的操作。
    解释:这里面的局部指的是核的大小,例如核大小是3*3的,则二值化的图像在核的范围内取最大值;
    作用:可以填充孔洞、连接断裂区域。

腐蚀

erosion_circle(Region : RegionErosion : Radius : )
参数:Region 输入的需要进行腐蚀操作的Region ;RegionErosion 是输出的腐蚀完成的Region ;由于该算子用圆形卷积核,Radius 是半径大小;

  • 腐蚀(Erosion):就是求局部最小值的操作。
  • 解释:这里面的局部指的是核的大小,例如核大小是3*3的,则二值化的图像在核的范围内取最小值;
  • 作用:可以去除噪声,消除小于结构元素的噪声点

膨胀腐蚀程序展示

*程序运行前图像化窗口和设置的恢复 dev_close_window()dev_clear_window()dev_set_color('white')dev_set_draw('fill')dev_set_line_width(1)*读图片 read_image(Image,'pellets')threshold(Image,Dark,120,255)*腐蚀 erosion_circle(Dark,RegionErosion,7.5)*膨胀 dilation_circle(RegionErosion,RegionDilation,7.5)*窗口1:原图 dev_open_window(0,0,400,300,'black',W1)dev_display(Image)disp_message(W1,'原始图像','window',10,10,'black','true')*窗口2:阈值二值区域 dev_open_window(0,420,400,300,'black',W2)dev_display(Dark)disp_message(W2,'阈值分割','window',10,10,'black','true')*窗口3:腐蚀 dev_open_window(320,0,400,300,'black',W3)dev_display(RegionErosion)disp_message(W3,'腐蚀','window',10,10,'black','true')*窗口4:膨胀 dev_open_window(320,420,400,300,'black',W4)dev_display(RegionDilation)disp_message(W4,'膨胀','window',10,10,'black','true')

运行结果:

从以上运行结果可以看出腐蚀可以消除小于核的噪点,膨胀可以消除孔洞,链接断裂区域;

开运算

opening_circle(Region : RegionOpening : Radius : )
参数:Region 输入的需要进行开运算操作的Region ;RegionOpening 是输出的开运算完成的Region ;由于该算子用圆形卷积核,Radius 是半径大小;

  • 开运算(Opening):先腐蚀后膨胀;
    作用:去掉小噪点、孤立小点,物体整体大小几乎不变。适合:阈值后消除背景噪声斑点

闭运算

closing_circle(Region : RegionClosing : Radius : )
参数:Region 输入的需要进行闭运算操作的Region ;RegionClosing 是输出的闭运算完成的Region ;由于该算子用圆形卷积核,Radius 是半径大小;

  • 闭运算(Closing):先膨胀后腐蚀;
    作用:填补物体内部小孔、小缝隙,把目标内部小洞补上。适合:目标里面有黑洞孔洞。

开闭运算程序展示

dev_close_window()dev_clear_window()dev_set_color('white')dev_set_draw('fill')dev_set_line_width(1)read_image(Image,'pellets')threshold(Image,Dark,120,255)*开运算 opening_circle(Dark,RegionOpening,3.5)*闭运算 closing_circle(Dark,RegionClosing,3.5)*窗口1:原图 dev_open_window(0,0,400,300,'black',W1)dev_display(Dark)disp_message(W1,'原始图像','window',10,10,'black','true')*窗口2:阈值二值区域 dev_open_window(0,420,400,300,'black',W2)dev_display(RegionOpening)disp_message(W2,'阈值分割','window',10,10,'black','true')*窗口3:腐蚀 dev_open_window(320,0,400,300,'black',W3)dev_display(RegionClosing)disp_message(W3,'腐蚀','window',10,10,'black','true')

运行结果:
开运算结果和原图对比:

由以上图片结果可以看到开运算消除了背景上的零星小白点;
闭运算结果和原图对比:

由以上图片结果可以看到闭运算消除了目标里面的小孔洞,没有消除背景上的小白点;

顶帽

顶帽和底帽用于提取图像中的亮细节或暗细节。

顶帽(Top Hat):原图与开运算结果的差值,突出亮前景。

  • 公式:顶帽 = 原图 − 开运算
  • 作用:提取小的凸起碎块、小连通域,这些碎块小于结构元;大于结构元的物体会被过滤掉
read_image(Image,'D:/learn/halcon/4.png')threshold(Image,Region,30,255)gen_circle(SE,20,20,3)*top_hat拿到被开运算去掉的碎点 top_hat(Region,SE,RegionTopPart)dev_open_window(0,0,300,300,'black',W1)dev_display(Region)disp_message(W1,'阈值region:','window',10,10,'red','true')dev_open_window(0,320,300,300,'black',W1)dev_display(RegionTopPart)disp_message(W1,'顶帽:','window',10,10,'red','true')

运行结果:

底帽

底帽(Black Hat):闭运算结果与原图的差值,突出暗区域。

  • 公式:bottom_hat = closing(Region) − Region
  • 作用:提取闭运算填补上的孔洞、缝隙。只拿到被闭运算填掉的那一小块区域,不是处理整张灰度图。
read_image(Image,'D:/learn/halcon/5.png')threshold(Image, Region,0,30)gen_circle(SE,20,20,3)*底帽 bottom_hat(Region, SE, RegionBottomHat)* opening得到清理后的完整区域 * opening_circle(Region, RegionClean,3.5)* count_obj(RegionTopPart, N)*N=0代表没有毛刺可以提取,top_hat自然输出空 dev_open_window(0,0,300,300,'black', W1)dev_clear_window()dev_display(Image)disp_message(W1,'阈值region:','window',10,10,'red','true')dev_open_window(0,320,300,300,'black', W2)dev_clear_window()dev_display(RegionBottomHat)disp_message(W1,'顶帽:','window',10,10,'red','true')

Blob连通域分析

Blob(Binary Large Object),在机器视觉里 = 图像中的一块连通前景区域,也就是连通域。
通俗理解:图像里,和背景颜色 / 灰度不一样、互相挨在一起的一团像素,就叫一个 Blob。
比如图片里几颗黑色颗粒,每一颗颗粒就是 1 个 Blob。

  1. 举例解释Blob
    一张图有 3 个分开的零件:
    threshold()阈值分割完,返回1个Region 对象,把3个零件全部打包在一起;
    调用connection() → 输出 3 个 Region,3 个 Blob,3 个连通域。
    不执行 connection,你拿到的不是 3 个 Blob,是一个大合并区域,后续算面积、重心全部出错。

  2. Blob连通域分析流程
    Blob 分析 = Blob 连通域分析整套流程:
    (1)图像滤波
    (2)阈值分割,分出前景背景
    (3)connection 拆分出每一个 Blob
    (4)根据面积、圆度、长宽筛选 Blob,去掉噪声小点
    (5)计算每个 Blob 的位置、大小、角度
    适用场景:颗粒计数、孔洞检测、工件定位、印刷污点检测。

  3. 容易混淆点
    (1)Blob 不是图像,是Region 区域对象(Halcon 的 Region 数据类型,不是 Image)
    (2)Blob 只关心像素是否相连,不关心像素灰度值,灰度已经在阈值阶段过滤完了。

  4. 简单一句话总结
    Blob = 二值图像中,相互连通的一团前景像素。Blob 分析就是提取、筛选、测量这一团团斑点。

以上内容如果帮到您请点赞收藏,如果有错误欢迎指正!

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

相关文章:

  • 3步重塑Photoshop AI工作流:SD-PPP开源插件的颠覆性创新
  • AI Agent如何操作浏览器:从Playwright到LLM的完整实现架构
  • 2026佛山铝型材BOM生产MRP运算ERP实力** - 甄选测评官
  • 《百战天虫:导演剪辑版》更新:扩展包、混音专辑及在线创作工具来袭!
  • 嘎嘎降AI双引擎技术揭秘:为什么达标率能做到99.26%? - 还在做实验的师兄
  • 去美国大使馆做公证怎么办理?办理渠道还有哪些?公证认证避坑指南与多渠道实测大揭秘 - 指上通
  • opencode 命令行安装
  • 沈阳的范畴及适配群体参考 - 小范同学a
  • iOS 上架审核 4.3(a) 最新2026全面解读
  • SVN服务器部署与客户端配置实战:从VisualSVN到TortoiseSVN全流程指南
  • 如何高效找回遗忘的压缩包密码:ArchivePasswordTestTool实战指南
  • 三步快速上手 tunnelto:零配置实现本地服务公网访问与内网穿透
  • 第 3 章 FOC 前置数学基石:Clark 变换
  • 手写MCP文件读写Server:为AI大模型打造安全可控的本地文件操作能力
  • 手把手教你学 Simulink—— 双定子永磁同步电机(DSPMSM)的协同控制与转矩提升仿真
  • Python中self.__class__的深度解析:从动态继承到工厂模式实战
  • 开发一个生产级 Agent 的最佳实践
  • 为什么选择BilibiliDown:5分钟掌握B站视频高效下载的终极解决方案
  • TikTok公会注册一站式代办选哪家 - 甄选测评官
  • 2026榆林汽车玻璃膜哪家好 车主优选指南 - 谁都没有我好看
  • Netty拆帧神器DelimiterBasedFrameDecoder:原理、实战与避坑指南
  • 永春县新房装修除甲醛怎么选?实地调研测评,本地除醛机构避坑指南 - 专注室内空气检测治理
  • 大连婚纱照实测:6家口碑摄影店推荐与避坑指南 - 商业信息快查
  • 软件工程工业化实践:Gitee 智能化软件工厂全链路标准化交付体系解析
  • 2026深圳工程款财产保全强制执行 全风险代理专业律师团队 - 资讯123
  • python深度学习:Numpy
  • XHS-Downloader终极指南:三步掌握小红书无水印下载的完整解决方案
  • 晋中本地防水维修科普:漏水原因、施工方案与选择建议 - 筑宅安
  • 国产替代路径:中距测温传感器选型的五个实际考量与一个关键提醒
  • STM32标准固件库工程模板搭建指南:从零构建Keil MDK开发环境