Blob分析---ball_seq.hdev(可与ball. hdev这篇互相参考比对)

这段代码展示了如何使用Halcon读取多个图像,并进行焊点检测。首先,通过`min_max_gray`算子确定灰度范围,然后通过阈值处理和形状变换提取电路板及焊点区域。接着,使用`expand_gray`和`opening_circle`进行区域优化,最后通过`sort_region`和`smallest_circle`对焊点进行排序和定位。整个流程实现了自动化图像分析和焊点检测。
摘要由CSDN通过智能技术生成

程序源码

* ball_seq.hdev:多个图像文件的读取,和ball.hdev类型相似,这里讲解了如何一次性读取多个图像

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算子
    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

1、ImageNames := 'die/' + ['die_02', 'die_03', 'die_04', 'die_07']

  • 给Image Names元组里面存放图片的相对路径
  • ImageNames = ['die/die_02', 'die/die_03', 'die/die_04', 'die/die_07']
  • 可以直接通过访问元组内容的方式读取图片
  • read_image (Bond, ImageNames[0])

2、NumImages := |ImageNames|

  • 在Halcon中,给一个元组加上绝对值符号,意思是计算这个元组中元素的数量
  • NumImages = 4

3、min_max_gray (Bond, Bond, 0, Min, Max, Range)

  • 确定区域内的最小和最大灰度值
  • 参数:输入区域(其特征被计算),输入灰度图像,如下所示,输出最小灰度值,输出最大灰度值,最大值和最小值之差
  • 第三个参数:百分比低于(高于)绝对最大值(最小值),默认为0

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

  • 3是第一次使用该算子用来对图像中亮的部分进行操作得到处理后的区域Die,再一次使用是为了对暗的部分进行操作(这里是目的操作),也就是为了得到球形焊点进行的预处理操作

5、两次min_max_gray()的使用

  • 经观察发现,电路板中亮的区域正好四边沿都有,使用阈值提取把亮色的提取出后,转换成矩形,就可以切出整个产品需要的部分
  • 不知道亮色的部分是多大,所以这里使用min_max_gray()算子来计算,就不需要一个个的灰度值去测试了,比较方便
  • 有灰度值不确定的地方,可以使用这个算子去自动计算

6、gen_empty_region (Forbidden)

  • 创建一个空白的区域(无像素)

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

  • expand_gray(Regions, Image, ForbiddenArea : RegionExpand : Iterations, Mode, Threshold : )
  • 填充区域之间的空白(取决于灰度值或颜色)或分割重叠区域
  • 第一个参数:输入间隙要被关闭的区域,或要被分开的区域
  • 第二个参数:输入用于灰度值或颜色比较的图像(可能为多通道)
  • 第三个参数:输入不发生扩张的地区
  • 第四个参数:输出扩展或分离的区域
  • 第五个参数:输入迭代次数,默认'maximal'
  • 第六个参数:输入扩展模式,默认'image'
  • 第七个参数:输入区域边界的灰度值或颜色与扩展候选区域之间的最大差值

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盾山狂热粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值