在本教程中,我们将向您展示如何使用 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
:在图像上显示圆的直径信息,保留四位小数。