HALCON-从入门到入门-阈值分割定位算子综合运用

2024-06-12 16:20

本文主要是介绍HALCON-从入门到入门-阈值分割定位算子综合运用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.废话

之前我的一个师兄告诉我,针对图像上想要定位的内容,机器视觉中定位的方式有很多种,但是如果用阈值分割定位可以做的,就不要用模板匹配了。因为基于形状的模板匹配始终会存在匹配不到的风险,那如果打光效果可以,阈值分割定位的效果就会稳定很多。

其实可以分为两种情况:

第一种,使用背光打出来的图像,图像边缘非常锋利,且形状一致性比较强,周围背景色块干扰比较多,这种情况我们考虑形状给模板匹配。

第二种,产品正面打光,边缘存在过渡像素,周围背景色块干扰小,形状差异较大,这种我们考虑阈值分割进行产品定位。

后面慢慢学习过来之后就发现,在实际上很多的项目中,打光出来的成像效果在边缘都不是非常清晰,过渡非常明显的,由于产品一致性的原因,很多时候拍照出来产品的形状也会发生变换,那么我们使用阈值分割会比较稳定一些。

2.实现效果

下面是阈值分割的效果图。

这是一张芯片引脚的图片,案例的目的是将引脚的焊点定位出来。

其中用到的算子就都是二值化,形状选择,形态学操作的组合。

3.代码解析

1.首先第一步读取图片

read_image (Bond, ImageNames[I])

2.获取整个图像上的灰度最大最小值

    min_max_gray (Die, Bond, 0, Min, Max, Range)

3.基于灰度最小值,二值化出黑色部分像素

    threshold (DieGrey, Wires, 0, Min + 30)

4.对得到的区域进行开运算

    opening_circle (WiresFilled, Balls, 9.5)

5.区域的连通域分析

筛选出更类似矩形的区域

    connection (Balls, SingleBalls)select_shape_std (SingleBalls, Rect, 'rectangle1', 90)

6.将类似于矩形的区域排除

    difference (SingleBalls, Rect, IntermediateBalls)

7.根据图像上的像素,对区域进行展开

    gen_empty_region (Forbidden)expand_gray (IntermediateBalls, Bond, Forbidden, RegionExpand, 4, 'image', 6)

8.继续进行开运算

    opening_circle (RegionExpand, RoundBalls, 15.5)

完成目标。

4.文件

* ball_seq.hdev: Inspection of Ball Bonding
* 
dev_update_off ()
ImageNames := 'die/' + ['die_02','die_03','die_04','die_07']
dev_set_colored (12)
read_image (Bond, ImageNames[0])
get_image_size (Bond, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
NumImages := |ImageNames|
for I := 0 to NumImages - 1 by 1read_image (Bond, ImageNames[I])dev_display (Bond)min_max_gray (Bond, Bond, 0, Min, Max, Range)threshold (Bond, Bright, Max - 80, 255)shape_trans (Bright, Die, 'rectangle2')dev_display (Die)reduce_domain (Bond, Die, DieGrey)min_max_gray (Die, Bond, 0, Min, Max, Range)threshold (DieGrey, Wires, 0, Min + 30)fill_up_shape (Wires, WiresFilled, 'area', 1, 100)opening_circle (WiresFilled, Balls, 9.5)connection (Balls, SingleBalls)select_shape_std (SingleBalls, Rect, 'rectangle1', 90)difference (SingleBalls, Rect, IntermediateBalls)gen_empty_region (Forbidden)expand_gray (IntermediateBalls, Bond, Forbidden, RegionExpand, 4, 'image', 6)opening_circle (RegionExpand, RoundBalls, 15.5)sort_region (RoundBalls, FinalBalls, 'first_point', 'true', 'column')smallest_circle (FinalBalls, Row, Column, Radius)NumBalls := |Radius|Diameter := 2 * RadiusmeanDiameter := sum(Diameter) / NumBallsmimDiameter := min(Diameter)dev_display (RoundBalls)if (I != NumImages)disp_continue_message (WindowHandle, 'black', 'true')endifstop ()
endfor

这篇关于HALCON-从入门到入门-阈值分割定位算子综合运用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054717

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

Swagger在java中的运用及常见问题解决

《Swagger在java中的运用及常见问题解决》Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,:本文主要介绍Swagger在java中的运用及常... 目录前言1. Swagger 的主要功能1.1 交互式 API 文档1.2 客户端 SDK 生成1.3