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 1
    read_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 * Radius
    meanDiameter := sum(Diameter) / NumBalls
    mimDiameter := min(Diameter)
    dev_display (RoundBalls)
    if (I != NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
    endif
    stop ()
endfor
相关推荐
YaraMemo12 分钟前
元启发式算法框架
人工智能·算法·5g·信息与通信·启发式算法·信号处理
草邦设计开发团队_媒体资源平台16 分钟前
GEO 信源整合一键发布软文:从内容生产到流量获客的自动化实践
运维·人工智能·自动化
zzz_236827 分钟前
个人 AI 记忆如何跨工具复用:用 Markdown、索引和 Skill 搭一个可治理的记忆库
前端·人工智能·react.js·前端框架·agent·agent测评
霸道流氓气质31 分钟前
Spring AI 输出解析器进阶
人工智能·windows·spring
天天代码码天天31 分钟前
纯 C OCR 又补齐 Java 生态了!lw.PPOCR.C v0.1.0-preview.7 发布
人工智能
实验室管理云平台35 分钟前
LIMS 系统常见问题(技术向):从数据采集到系统集成,开发与运维视角的踩坑记录
人工智能
程序员-李俞43 分钟前
RelayRouter大模型 API 接入实践:用统一路由降低多模型调用成本与维护复杂度
人工智能
Agudamu11611 小时前
AI 视频学习笔记工具拆解:4款工具谁能把视频变成复习资料
人工智能·学习·音视频
2601_967659911 小时前
2026年江西GEO系统贴牌服务商怎么选才稳妥
人工智能
外域速览1 小时前
2026世界动力电池大会今日宜宾启幕:固态电池从实验室走向量产,IEC 国际标准终结概念乱象
大数据·人工智能·microsoft