Halcon中该如何对圆形区域检测与直径测量

在本教程中,我们将向您展示如何使用 Halcon 图像处理库进行球形区域的检测,并拟合最小圆以计算其直径。整个过程包括图像预处理、形状提取、圆形检测和最终的直径计算。此过程在多个领域都有广泛应用,比如材料检测、自动化生产线等。

1. 项目准备

首先,请下载项目文件并确保您已安装了Halcon开发环境。项目文件包括处理所需的图像和代码,您可以直接运行代码,查看效果。

项目下载链接

通过网盘分享的文件:圆形区域检测与直径测量.7z
链接: https://pan.baidu.com/s/1kTduurKsCrjxpTQJ7AlkYg?pwd=jkcf 提取码: jkcf

2. 打开图像并进行初步显示

在开始处理图像之前,我们需要打开一个窗口来显示图像:

dev_update_window ('off')  
dev_close_window ()  
dev_open_window (0, 0, 728, 512, 'black', WindowID)  
read_image (Bond, 'die_03.png')  
dev_display (Bond)  
set_display_font (WindowID, 14, 'mono', 'true', 'false')  
disp_continue_message (WindowID, 'black', 'true')  
stop ()  
  • dev_open_window:打开一个新的图像显示窗口,设置为黑色背景,并指定尺寸。
  • read_image:加载名为die_03.png的图像。
  • dev_display:将图像显示在窗口中。

这样,您就能够看到原始图像并开始后续处理。

3. 图像二值化与矩形区域提取

接下来,我们将对图像进行二值化处理,提取灰度值在100到255之间的区域,并从中提取矩形形状。二值化是图像处理中的基础操作,目的是将图像中的对象与背景区分开来。

threshold (Bond, Bright, 100, 255)  
shape_trans (Bright, Die, 'rectangle2')  
dev_display (Die)  
  • threshold:将灰度值在100到255之间的像素提取出来,生成二值图像。
  • shape_trans:从二值图像中提取矩形区域。
  • dev_display:显示矩形区域Die

4. 区域提取与二值化

我们使用提取出来的矩形区域Die对原图进行区域提取,并对提取的区域进行二值化,提取灰度值在0到50之间的区域:

reduce_domain (Bond, Die, DieGrey)  
threshold (DieGrey, Wires, 0, 50)  
fill_up_shape (Wires, WiresFilled, 'area', 1, 100)  
  • reduce_domain:根据矩形区域Die提取图像中的感兴趣部分。
  • threshold:对提取的区域DieGrey进行二值化,灰度值在0到50之间的区域被提取出来。
  • fill_up_shape:填充面积在1到100之间的区域,得到更清晰的球形区域。

5. 提取球形区域

接下来,我们通过开运算来提取球形区域。开运算可以去除图像中的噪声,保留形状较大的区域。

opening_circle (WiresFilled, Balls, 15.5)  
dev_display (Balls)  
disp_continue_message (WindowID, 'black', 'true')  
stop ()  
  • opening_circle:对二值图像进行圆形开运算,半径为15.5。这样可以去除小区域,提取出球形区域。
  • dev_display:显示提取出的球形区域Balls

6. 区域连接与筛选圆形度

在这个步骤中,我们将相连的球形区域连接成一个物体,并筛选圆形度在0.85到1.0之间的区域,以确保只有真正的球形区域被保留下来。

connection (Balls, SingleBalls)  
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)  
sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')  
  • connection:将相连的区域连接为单一物体。
  • select_shape:筛选符合圆形度条件(圆形度在0.85到1.0之间)的物体。
  • sort_region:按物体的第一个点进行排序,并按列排序。

7. 最小圆拟合与直径计算

对于每个球形区域,我们拟合最小圆,并计算直径。最小圆是能包住球形区域的最小圆,因此可以用来表示球形的大小。

smallest_circle (FinalBalls, Row, Column, Radius)  
NumBalls := |Radius|  
Diameter := 2 * Radius  
meanDiameter := mean(Diameter)  
minDiameter := min(Diameter)  
  • smallest_circle:为每个物体拟合最小圆,得到圆心和半径。
  • NumBalls := |Radius|:计算球的数量。
  • Diameter := 2 * Radius:计算球形区域的直径。
  • meanDiameter := mean(Diameter):计算所有球形区域的平均直径。
  • minDiameter := min(Diameter):计算最小直径。

8. 绘制拟合圆与显示结果

最后,我们将拟合的最小圆绘制在图像上,并显示每个圆的直径信息。

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')  
  • disp_circle:在图像中绘制拟合的最小圆。
  • disp_message:在图像上显示圆的直径信息,保留四位小数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

极客晨风

感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值