使用Halcon进行骨架提取,为什么提取不到两端

使用halcon对弯曲物料进行长度提取时,选择使用中线提取时有许多细小线段,使用骨架提取则两端长度缺失,是怎么回事,怎么解决才能达到图3这样的效果?

img

img

img

使用中线提取,可以提取到两端,推荐使用lines gauss算子。

参考GPT和自己的思路:骨架提取算法是一种基于像素点的迭代算法,它的结果可能会受到一些影响,例如图像中存在空洞、断裂、重叠等情况。在骨架提取过程中,两端长度缺失可能是由于以下原因:

1 骨架提取算法中使用的迭代次数不够多,导致骨架没有完全延伸到两端。
2 图像中存在空洞、断裂等情况,使得骨架提取算法无法完整提取出骨架。
3 图像中的噪声干扰导致骨架提取失败。
要解决这个问题,可以尝试以下方法:

1 调整骨架提取算法的迭代次数,增加骨架延伸的长度,直到两端长度都能够提取到。
2 对图像进行预处理,去除空洞、断裂等干扰,使得骨架提取算法能够完整提取出骨架。
3 对图像进行滤波、降噪等处理,减小噪声干扰的影响,提高骨架提取的准确性。
需要根据具体情况选择合适的处理方法,可能需要尝试多种方法才能达到理想的效果。同时,也需要注意骨架提取算法的局限性,它不能处理图像中存在的一些复杂情况,例如交叉、环形等情况,需要结合实际情况选择合适的方法。

骨架提取可能还会受到以下因素的影响:

1 骨架提取的参数设置不正确,例如线宽或线性度量的距离过大或过小,会导致骨架丢失或细化不足,可以尝试调整这些参数。

2 骨架提取的前期处理不完善,例如二值化的阈值不合适,会导致骨架的中断或重复,可以尝试调整阈值或使用其他二值化方法。

3 骨架提取的物体形状复杂或存在噪声,会导致骨架提取不完整或出现错误,可以尝试对物体进行预处理,例如平滑或去噪。

因此,您可以检查这些因素,并尝试调整相关参数或进行预处理来解决问题。

以下是一个示例代码,使用Halcon进行骨架提取,并且尝试处理骨架断裂的问题:

read_image(Image, 'your_image.jpg')
binarize(Image, BinaryImage, 128, 255)
skeleton(BinaryImage, Skeleton)

// 处理骨架断裂的问题
skeleton_union(Skeleton, SkeletonUnion)
skeleton_pruning(SkeletonUnion, SkeletonPruned)
skeleton(SkeletonPruned, Skeleton)

// 获取骨架端点的位置
skeleton_end_points(Skeleton, EndPoints)

// 对骨架端点进行扩展
radius := 5
opening_circle(EndPoints, EndPointsOpened, radius)

// 计算骨架长度
skeleton_length(Skeleton, Length)

// 显示结果
dev_display(Image)
dev_display(Skeleton)
dev_display(EndPointsOpened)
disp_message(0, 0, 'Length: ' + Length)


在这个示例代码中,我们先读取图像并将其二值化,然后使用skeleton函数提取骨架。为了处理骨架断裂的问题,我们使用skeleton_union和skeleton_pruning函数对骨架进行处理。然后,我们使用skeleton_end_points函数获取骨架的端点位置,并使用opening_circle函数对端点进行扩展。最后,我们使用skeleton_length函数计算骨架的长度,并在图像上显示结果。

请注意,这只是一个示例代码,并不一定适用于您的具体问题。您需要根据您的情况进行修改和调整,以获得最佳的结果。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
骨架提取是基于二值图像进行的,它会将物体变成中空的、由骨架线连接的复杂图形。而弯曲物料的两端长度缺失,可能是由于骨架提取算法在边界处理上的缺陷导致的。因为骨架提取算法默认物体是有边界的,如果物体的某个边界与图像边缘重合,或者物体边界在图像边缘之外,骨架提取算法就会出现问题,导致两端长度缺失。

解决该问题的方法包括:

  1. 对二值图像进行膨胀或者腐蚀处理,使得物体边界不再与图像边缘重合或在图像边缘之外,从而使骨架提取得以正常进行。

  2. 可以使用边界拓展算法或者曲线拟合算法对物体边缘进行处理,使得物体的边缘完整,并与图像边缘不重合。

  3. 选择合适的参数,如骨架宽度、尺寸过滤等,以适应不同物体的特点。

以下是使用Halcon进行骨架提取的示例代码:

read_image (Image, 'sample.jpg')
threshold (Image, Region, 128, 255)
skeleton (Region, Skeleton)

以上代码将读入名为'sample.jpg'的二值图像进行阈值分割,并对分割得到的区域进行骨架提取,最终得到的骨架线为'Skeleton'。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^