Halcon粘连木材图像的目标分割计数

发布时间:2024年01月04日

Halcon粘连木材图像的目标分割计数


本文以一个实际场景图片为例,介绍阈值处理与形态学计算的应用。案例图像如图所示,图(a)为输入的原始图像,图(b)为处理结果。图中计算出了木材的数量,并以不同的颜色对分割出的区域进行了区分。
在这里插入图片描述
首先,从阈值处理开始,图(a)在进行全局阈值处理之后出现了一些问题。阈值设得高了,会蛮化边角的一些木头的局部区域;设得低了,会造成一些区域的粘连。另外,图像中还有一些木棍等小面积物体的干扰。如何在保留边角局部信息的情况下尽可能地防止粘连,是一个要仔细考虑的问题。
结合这个问题,本例的思路分两步走:先把边角一些小的木头区域提取出来,再专门解决粘连的问题。

1. 提取面积较小区域

区分大小的依据主要是面积,在做了一些基本的图像预处理之后,可以把面积较小的一部分图像。如靠近 4个边的部分木头先分割出来。在这个过程中,需要对木头边缘做一些处理,去掉外圈的树皮和一些干扰的区域,提取出木头截面的大块部分。图 (a)为初步阈值分割的结果,图(b)是根据面积的大小,提取出的比较小的,即比较独立的区域。
在这里插入图片描述

2. 分割较大区域

这一步比较简单,针对粘连的情况,可以通过腐蚀操作让边缘更加清晰。图(a)是提取出的面积较大的区域,可见单个木材区域发生了粘连,对其做腐蚀运算,提取出独立的区域,效果如图(b)所示。
在这里插入图片描述

3. 区域合并与计数

把上一步割出的大小区域分别合并,即可得到木头的总数。实现代码如下:

dev_close_window ()
*读取图像,将其转化为灰度图像并显示出来
read_image (Image, 'data/logs')
get_image_size (Image, Width, Height)
rgbl_to_gray(Image, grayImage)
*进行全局阈值分割,将亮色区域提取出来
threshold (grayImage, Bright, 60, 255)
*进行开运算处理,去除边缘毛刺
opening_rectanglel (Bright, Cut, 1, 7)
*将非连通区域分割成独立区域
connection (Cut, ConnectedRegions)
*选择截面比较小的木材的区域
select_shape (ConnectedRegions, smallRegions, 'area', 'and', 500, 20000)
*对粘连区域做腐蚀操作,根据腐蚀的情况和面积选出截面区域
*count_obj(SelectedRegions2,number1)
*选择截面比较大的木材的区域,可能有粘连和区域重叠的情况
select_shape (ConnectedRegions, largeRegions, 'area', 'and', 20000, 1000000)
erosion_circle(largeRegions,erisionedLargeRegions,8.5)
*将非连通区域分割成独立区域
connection (erisionedLargeRegions, ConnectedRegions2)
*再次选择符合面积条件的区域,排除杂点
select_shape (ConnectedRegions2, SelectedRegions3, 'area', 'and', 150, 200000)
*区域合并
concat_obj(smallRegions, SelectedRegions3, ObjectsConcat)
*区域计数
count _obj (ObjectsConcat,number3)
*创建窗口用于显示结果
dev_open_window (0, 0, Width, Height, 'black', Windowiandle)
dev display(ObjectsConcat)
set_display_font (WindowHandle,18,'mono''true','true')
*显示计数的结果,程序结束
disp_message (WindowHandle,'Number of logs : '+number3, 'image', 30, 50, 'blue','true')

本例以木材截面区域的面积为分割依据,通过形态学运算将单个木材的截面区域提取出来,这样可方便进行木材的计数。

文章来源:https://blog.csdn.net/fallingleafgrief/article/details/135394583
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。