机器视觉_HALCON_示例实践_1.检测圆形

news2024/11/28 5:37:58

文章目录

  • 一、引言
  • 二、检测圆形
  • 三、总结


一、引言

前面的文(用户指南/快速向导)差不多已经把HALCON的基本内容讲完了,并且在学习过程中还跑过一个简单示例——在单一背景下定位回形针。示例跑过,顿时觉得自己行了,但如果此时(假设你和我一样没有其他图像处理经验)你想上手解决一个实际问题,很可能寸步难行。

就拿我来说,随手找了张图片,想定位图片中的目标图形——硬币。
在这里插入图片描述

于是,按照回形针示例中的步骤,借用灰度图像来阈值化,得到的图片是这样的,
在这里插入图片描述
先不谈背景中的大红块,连颜色相近的文字也被保留了下来,这不是我希望保留的。不过也很正常,因为用到的图像处理是基于形态学的,简单讲就是颜色、形状、面积的匹配,是比较傻瓜式的,实际上计算机并不认识硬币。

那如何去掉这些背景中不希望保留的元素呢,经过我一番查阅,知道了两种常用操作——腐蚀(erosion)和膨胀(dilation)。因为本文不是主要介绍它们的实现,所以只简单谈一下经过它们处理的效果。

腐蚀(erosion)
自然界中的腐蚀,假设你有一块铁板,经过腐蚀后,可能会变得像下图一样锈迹斑斑且有许多破洞,这些破洞大的区域,可能原本就有损坏、比较脆弱;而一些保留相对完好的区域,原本可能是成块的、比较结实的部分(假设腐蚀对每块区域作用都一样)。
在这里插入图片描述
而图像处理中的腐蚀,作用于引言中的示例图后,就得到了下图。可以看到,其实效果类似铁板腐蚀,大块图形保留较好,而一些细小图形直接消失了(被腐蚀掉了);大图形上的一些小孔,经过腐蚀也变大了。
在这里插入图片描述
膨胀(dilation)
说到膨胀,自然就想到吹气球,气球充气后变大了(当然也可能爆掉)。图像处理中的膨胀也类似(但不会爆),它是与腐蚀相反的操作。把图像中的像素/区域想成一个气球,经过膨胀后,它就变大了。下面对示例图做膨胀,原来那些密密麻麻的字体明显变粗壮了,就像墨水在纸上洇开来一样。
在这里插入图片描述

Ok,关于腐蚀和膨胀到这里就差不多了(应用章节能理解其效果即可)。现在开始跑一个官方示例 Inspection of Ball Bonding ,在HDevelop示例程序中搜索 ball 关键字,可以找到该示例工程,选中 ball.hdev 打开。

二、检测圆形

这是示例原图,现在要找到并标注黑色圆形粘接口,接下来一行行学习它的程序(共五十多行)。
在这里插入图片描述
HALCON程序的头几行,

* ball.hdev: Inspection of Ball Bonding
* 
dev_update_window ('off')
dev_close_window ()
dev_open_window (0, 0, 728, 512, 'black', WindowID)

*(星号)开头的是注释,剩下三行以 dev_ 前缀的与图形处理无直接关系,它们的作用分别是:

  1. 会关闭图像变量向图形窗口的自动输出(设置为’off’,还有一点好处是当你选中图像变量,图形窗口中只会显示选中的图像变量,方便观察,不然需要手动再选一次 显示/清除)
  2. 关闭活动的图形窗口
  3. 并打开一个728×512的黑色背景窗口。

接着,读取原图,

read_image (Bond, 'die/die_03')

虽然上面代码中关闭了图像变量自动显示在活动窗口,但在你单步调试程序时,这点会被无视掉。下面用 dev_display 显式输出读取的图像到图形窗口。

dev_display (Bond)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()

剩下两句看似是系统算子,但实际上是预定义好的外部函数。效果就是在图像下方显示文字,接着 stop() 暂停程序执行。
在这里插入图片描述
接下来是老朋友了,阈值化。

threshold (Bond, Bright, 100, 255)

在这里插入图片描述

阈值化后是一个新的算子 shape_trans ,它可以变换区域的形状。这边填的参数为 ‘rectangle2’ ,在输入区域中外接最小矩形。上面阈值化后的图像,顶部明显有一片区域是黑的,也就是没有像素的,这部分区域在后续处理过程中是不需要的,我们如何去掉它呢,就需要外接矩形了。

shape_trans (Bright, Die, 'rectangle2')

在这里插入图片描述
接下来几步是在外接矩形外围画一个框,并显示预定义好的文字提示信息,然后暂停一下。

dev_set_color ('green')
dev_set_line_width (3)
dev_set_draw ('margin')
dev_display (Die)
disp_continue_message (WindowID, 'black', 'true')
stop ()

在这里插入图片描述
你可能会问,有这么一个矩形有啥用呢?
别急,接下来的算子 reduce_domain 中会用到它,

reduce_domain (Bond, Die, DieGrey)

它会从原图中裁剪出矩形区域的图像,
在这里插入图片描述
这里的裁剪出图像,其实图像的尺寸未发生变化,你可以看到黑色背景还是在的,这相当于把矩形以外的区域去掉了,但保留背景/画布(HALCON中还有一个算子)。
上面这几步操作(获取目标矩形,用矩形裁剪图像)很常用,通常获取ROI区域就是这么做的。

接下来对裁剪得到区域再次进行阈值化,这次保留了灰度值低的区域(靠近0接近黑色,靠近255接近白色),另外图像顶部的黑色区域其实是没有像素的,所以并未选中

threshold (DieGrey, Wires, 0, 50)

在这里插入图片描述
下一步又是一个新的算子 fill_up_shape ,它的作用是填充区域中具有某些特征的空洞,下面参数表示的特征是面积,范围是1-100。也就是将该范围面积的空洞填满,

fill_up_shape (Wires, WiresFilled, 'area', 1, 100)

来看下放大后的效果吧,处理前,
在这里插入图片描述
处理后,
在这里插入图片描述
还是很明显的,区域内的小圆孔被填充满了。你可能会问,不是填充满吗,为什么消失了?因为图案是接近黑色的,填充后看起来就是消失了。

接下来又是一些额外操作,显示原图底片,用红色填充满处理后区域,

dev_display (Bond)
dev_set_draw ('fill')
dev_set_color ('red')
dev_display (WiresFilled)
disp_continue_message (WindowID, 'black', 'true')
stop ()

在这里插入图片描述
下一步是一个很有用的操作——开操作(halcon中名称为opening的都是开操作相关的),它的原理其实是腐蚀和膨胀的结合,即先腐蚀后膨胀,

opening_circle (WiresFilled, Balls, 15.5)

处理后的效果,是不是非常离谱,但理解了文章开头说的效果后,其实不难想象。
在这里插入图片描述
接下来,切换了输出颜色,重新输出处理后的区域,

dev_set_color ('green')
dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true')
stop ()

在这里插入图片描述
接下来三个算子, 先是connection 寻找区域内的连通部分;
第二个是新算子 select_shape ,找到具有目标特征的形状,这边填写的参数是 ‘circularity’ ,就是类圆的图形;
第三个算子就是字面意思,对图形按位置排序(这边参数表示按列值升序排)。

connection (Balls, SingleBalls)
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)
sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')

在这里插入图片描述
然后,又是换色显示原图对比,并输入提示文本,

dev_display (Bond)
dev_set_colored (12)
dev_display (FinalBalls)
disp_continue_message (WindowID, 'black', 'true')
stop ()

在这里插入图片描述
最后,
smallest_circle 确定这些圆形区域的最小外接圆,并将输出的坐标和半径做处理后输出到图形窗口。

smallest_circle (FinalBalls, Row, Column, Radius)
NumBalls := |Radius|
Diameter := 2 * Radius
meanDiameter := mean(Diameter)
minDiameter := min(Diameter)
dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius)
dev_set_color ('white')
disp_message (WindowID, 'D: ' + Diameter$'.4', 'image', Row - 2 * Radius, Column, 'white', 'false')
dev_update_window ('on')

在这里插入图片描述

至此,示例程序处理完毕。

之后,我用了示例方法处理文章开头的示例图,得到如下效果
在这里插入图片描述

三、总结

整个过程其实并不复杂,毕竟我们只是调用算子,不需要关注算法细节。
但这里还是得稍微总结一下所涉及的常用操作,

  • 阈值化,拿到图之后通常会先阈值化一下,方便后续处理。
  • 选取ROI,通常获取一个形状,然后用该形状去裁剪原图,可以减少后续图像处理量,并减少干扰区域。
  • 腐蚀和膨胀,上面示例中的开操作(opening)就包含了腐蚀和膨胀,你也可以分开来使用,常见的还有闭操作(closing)。这些操作通常用来去掉图像背景中的干扰区域,填充空缺。
  • 基于的特征的图形选择,这步是在寻找连通区域(connection)之后的。

上面提到的阈值化、选取ROI等操作都可以UI交互实现,比直接调参更方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当make执行遇到 Arguments too long

1. 问题 Ubuntu20.04上make编译生成so的时候报错: make[1]:execvp:/bin/sh:Arguments too long对应makefile中的报错位置,仅仅是生成so的时候报错,伪代码如下 ${build_tool} -shared -fpic -o "$" ${OBJ_FILE} ${LDFLAGS}然而如…

Linux基础 - NTP时间同步

‍‍🏡博客主页: Passerby_Wang的博客_CSDN博客-系统运维,云计算,Linux基础领域博主 🌐所属专栏:『Linux基础』 🌌上期文章: Linux基础 - DNS服务进阶 📰如觉得博主文章写的不错或对你有所帮助…

IP地址在网络安全行业有哪些应用?

随着我国网络安全法律的颁布实施、制度的细化落实以及标准体系的制定,为我国产业数字化和数字产业化铺平了道路。近几年,数据将对网络安全行业产生巨大影响,包括行业数据的采集、共享,智能算法的演进以及算力资源的复用&#xff0…

ContextCapture Master 倾斜摄影测量实景三维建模技术应用

查看原文>>>https://mp.weixin.qq.com/s?__bizMzAxNzcxMzc5MQ&mid2247582483&idx3&sn38b94b4415ff29531e1619afe0c4df87&chksm9be29c03ac951515c28be526c987b19aedc1a5b3ad98ada5676e8c548f0f229665f495a0f281&token10630879&langzh_CN#rdCo…

Windows 11 绕过 TPM 方法总结,通用无 TPM 镜像下载 (2023 年 1 月更新)

在虚拟机、Mac 电脑和 TPM 不符合要求的旧电脑上安装 Windows 11 的通用方法总结 请访问原文链接:https://sysin.org/blog/windows-11-no-tpm/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 本文要解决的问题…

Qt 不规则窗口,不规则按钮,不规划控件 不规则界面

有一些特殊情况,需要使用不规则窗口或按钮,看起来非常炫酷。 类似: Qt 实现 不规则样式设置,不是视觉欺骗,是真正的不规则 ,点击外面不会触发按钮的点击信号. Part1:不规则窗口 效果&#xf…

【软考——系统架构师】信息系统基础

🔎这里是【软考——系统架构师】,关注我考试轻松过线 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 文章目录👀一、信息化概述👀二、信息系统工程总…

json-server环境搭建及使用

json-server环境搭建 一个在前端本地运行,可以存储json数据的server。 基于node环境,可以指定一个 json 文件作为 API 的数据源。 文章目录json-server环境搭建前提下载安装监听服务启动成功修改端口号方式一:方式二:数据操作测试…

[Datawhale][CS224W]图机器学习(二)

文章目录一、概述1.1 图的结构1.2 特征处理1.3 学习任务1.3.1 节点分类1.3.2 链接预测1.3.3 图级任务二、传统方法三、统计特征与核方法3.1 节点层面3.2 连接层面3.3 图层面3.4 节点袋参考文献Datawhale开源学习社区 x 同济子豪兄 Stanford课程中文精讲系列笔记本文同时发布在&…

揭秘涨薪50%经验:从功能测试到自动化测试,我是如何蜕变的?

本人在今年互联网大环境如此严峻的情况下,作为一个刚毕业不到一年的初级测试,赶在“金三银四”依然拿到了一些面试机会,并且成功拿下4家公司的offer,其中不乏互联网大厂,而且最高总包给到了接近double(无炫…

动态规划问题

目录 一、动态规划简介 二、利用动态规划解决问题 1、斐波拉契序列 2、拆分词句 3、三角形最小路径和 4、不同的路径数目(一) 5、带权值的最小路径和 6、求路径ii 7、01背包 8、不同子序列 9、编辑距离 10、分割回文串 一、动态规划…

Go 语言中的 Slice 陷阱:如何避免常见错误

Go 语言中的 Slice 陷阱:如何避免常见错误前言slice 作为函数 / 方法的参数进行传递的陷阱slice 通过 make 函数初始化,后续操作不当所造成的陷阱性能陷阱小结耐心和持久胜过激烈和狂热。 哈喽大家好,我是陈明勇,本文介绍的内容是…

Lesson 7.1 无监督学习算法与 K-Means 快速聚类

文章目录一、聚类算法与无监督学习二、K-Means 快速聚类的算法原理1. K-Means 快速聚类的基本执行流程2. K-Means 快速聚类的背后的数学意义三、K-Means 快速聚类的 sklearn 实现方法1. sklearn 中实现 K-Means 快速快速聚类2. 轮廓系数基本概念与 sklearn 中实现方法从现在开始…

【基于jeeSite框架】SpringBoot+poi+Layui自定义列表导出

文章目录功能效果思路代码前台后台easyPoi,easyExcel,poi三者的区别poipoi依赖导出ExcelHSSF方式导出XSSF方式导出SXSSF方式导出导入excelHSSF方式导入XSSF方式导入SXSSF方式导入easyPoi依赖包采用注解导出导入easyExcel依赖采用注解导出导入API文档easyPoi操作文档…

内网渗透(二十五)之Windows协议认证和密码抓取-使用Hashcat和在线工具破解NTLM Hash

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

说说Knife4j

Knife4j是一款基于Swagger2的在线API文档框架使用Knife4j, 需要 添加Knife4j的依赖当前建议使用的Knife4j版本, 只适用于Spring Boot2.6以下版本, 不含Spring Boot2.6 在主配置文件(application.yml)中开启Knife4j的增强模式必须在主配置文件中进行配置, 不要配置在个性化配置文…

Java 代理模式详解

1、代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 代理模式的主要作用是扩展目标对象…

C++——运算符重载

1、运算符重载的概念 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。运算符重载的目的是让语法更加简洁运算符重载不能改变本来寓意,不能改变基础类型寓意运算符重载的本质是另一种函数调用…

【半监督医学图像分割 2021 TMI】SimCVD 论文翻译

文章目录【半监督医学图像分割 2021 TMI】SimCVD 论文翻译摘要1. 介绍2. 相关工作3. 方法3.1 总览3.2 任务制定3.3 基础体系结构3.4 边缘对比蒸馏4. 实验4.1 数据集和预处理4.2 实现细节5. 结论5.1 实验:LA5.2 实验:Pancreas6. 消融研究6.1 边界感知对比…

嵌入式ARM工业边缘计算机BL302的CAN总线接口如何设置?

CAN 接口如图所示,输入如下命令: ifconfig -a //查看所有网卡 如果 FlexCAN 驱动工作正常的话就会看到 CAN 对应的网卡接口,如图。从图中可 以看出,有一个名为“can0”的网卡,这个就是 BL302 板上的 CAN1 接口对应的 c…