【halcon】halcon 区域到轮廓转换(两种方式对比)

背景

什么情况下,需要将区域变换成轮廓,有啥好处?
1 轮廓是基于亚像素的,能提供更佳的精度。而区域最小也是一个像素。

2 轮廓可以认为是线条(其实是一些列的点),线条是一维的,而区域是二维的。
一维,有自己的特征,有时我们会借助这些特征,这些特征往往在二维上体现不明显。
比如:轮廓的长度,轮廓的曲度,轮廓闭合度

综上所诉,我们有时需要将区域变换成轮廓!

区域到轮廓转换相关函数

比如,我想找划痕,一开始我用lines_gauss效果很好,但是lines_gauss这个函数非常耗时,而且如果图片太大,会消耗大量内存且无法释放!(还没找到原因,后续找到原因后再分享一下)。
所以,我放弃了lines_gauss。

我先通过动态阈值找到比较黑的地方,划痕的特点是又细又长。所以我的思路是将区域转换成轮廓,再进行挑选。

gen_contour_region_xld

比如,这样一个区域:【halcon】halcon 区域到轮廓转换(两种方式对比)_第1张图片
我想将其变成线,应该怎么做?
首先,我通过 gen_contour_region_xld 得到效果:

gen_contour_region_xld (RegionClosing, Contours, 'border')

【halcon】halcon 区域到轮廓转换(两种方式对比)_第2张图片
相当于将一个区域挖空了,但这其实已经不是区域了,而是轮廓了! 这也不是我要的效果。
这次,我调整控制参数:

gen_contour_region_xld (RegionClosing, Contours, 'center')

效果差不多:
【halcon】halcon 区域到轮廓转换(两种方式对比)_第3张图片
因为这个区域不止一个像素。那我先把,这个区域变成一个像素的区域。

skeleton (RegionClosing, Skeleton)

【halcon】halcon 区域到轮廓转换(两种方式对比)_第4张图片
继续使用:

gen_contour_region_xld (Skeleton, Contours, 'border')

相当于对用轮廓这个像素进行了描边!但是我想取这个像素的中间值,行不行?可以的,轮廓是基于亚像素的,所以可以是半个像素。
【halcon】halcon 区域到轮廓转换(两种方式对比)_第5张图片
再次调整参数,这次发现区别了:

gen_contour_region_xld (Skeleton, Contours, 'center')

【halcon】halcon 区域到轮廓转换(两种方式对比)_第6张图片
应为这次区域只有一个像素,所以取center时,就是半个像素的位置,就是一条线了!这是我想要的。

gen_contours_skeleton_xld

这个函数,和 gen_contour_region_xld 有异曲同工之妙。
他是专门将一个像素的区域变成轮廓!所以也是先对区域进行skeleton操作。然后再进行轮廓操作。

gen_contours_skeleton_xld 和 gen_contour_region_xld 有更多的可操作性。
一下是函数的介绍:
GenContoursSkeletonXld 函数是Halcon库中的一个运算符,用于将骨架(例如边缘)转换为XLD(扩展线描述)轮廓。XLD轮廓是曲线或边缘的表示,具有附加信息,例如交叉点。以下是该运算符的参数和功能解释:

参数:

  1. skeleton(输入对象):

    • 类型:HRegion
    • 描述:要确定轮廓的输入骨架(例如边缘)。
  2. contours(输出对象):

    • 类型:HXLDCont(XLD轮廓数组)
    • 描述:生成的XLD轮廓将存储在此输出参数中。
  3. length(输入控制):

    • 类型:整数(HTuple)
    • 描述:轮廓必须具有的最小点数。此参数确定要生成的轮廓的长度。点数少于此长度的轮廓将被丢弃。
  4. mode(输入控制):

    • 类型:字符串(HTuple)
    • 描述:轮廓过滤模式,确定如何生成和过滤轮廓。
      • 可能的值:
        • “filter”:根据指定的条件生成和过滤轮廓。
        • “generalize1”:生成轮廓时不考虑短于指定长度的线段。
        • “generalize2”:如果线段以两个交叉点结束,则保留线段,即使它们短于长度。

具体信息,还请参考原始文档!
我们具体看效果:
gen_contours_skeleton_xld (Skeleton, Contours, 1, ‘filter’)
gen_contour_region_xld 不同 连续的区域变成轮廓之后可能会分成几段轮廓!
【halcon】halcon 区域到轮廓转换(两种方式对比)_第7张图片
gen_contours_skeleton_xld (Skeleton, Contours, 5, ‘filter’)
【halcon】halcon 区域到轮廓转换(两种方式对比)_第8张图片

gen_contours_skeleton_xld (Skeleton, Contours, 9, ‘generalize1’)
【halcon】halcon 区域到轮廓转换(两种方式对比)_第9张图片

小结

gen_contour_region_xld 会将连续的区域,变成连续的轮廓
而 gen_contours_skeleton_xld,会对区域分叉的地方进行特殊处理。
连续的区域变成轮廓之后可能会分成几段轮廓!
【halcon】halcon 区域到轮廓转换(两种方式对比)_第10张图片
这些分叉的地方会认为是支路轮廓,根据参数进行处理!

那今天的分享就到这里,我们下次见~~~~~

你可能感兴趣的:(halcon聚沙成塔,计算机视觉,人工智能)