什么情况下,需要将区域变换成轮廓,有啥好处?
1 轮廓是基于亚像素的,能提供更佳的精度。而区域最小也是一个像素。
2 轮廓可以认为是线条(其实是一些列的点),线条是一维的,而区域是二维的。
一维,有自己的特征,有时我们会借助这些特征,这些特征往往在二维上体现不明显。
比如:轮廓的长度,轮廓的曲度,轮廓闭合度
综上所诉,我们有时需要将区域变换成轮廓!
比如,我想找划痕,一开始我用lines_gauss效果很好,但是lines_gauss这个函数非常耗时,而且如果图片太大,会消耗大量内存且无法释放!(还没找到原因,后续找到原因后再分享一下)。
所以,我放弃了lines_gauss。
我先通过动态阈值找到比较黑的地方,划痕的特点是又细又长。所以我的思路是将区域转换成轮廓,再进行挑选。
比如,这样一个区域:
我想将其变成线,应该怎么做?
首先,我通过 gen_contour_region_xld 得到效果:
gen_contour_region_xld (RegionClosing, Contours, 'border')
相当于将一个区域挖空了,但这其实已经不是区域了,而是轮廓了! 这也不是我要的效果。
这次,我调整控制参数:
gen_contour_region_xld (RegionClosing, Contours, 'center')
效果差不多:
因为这个区域不止一个像素。那我先把,这个区域变成一个像素的区域。
skeleton (RegionClosing, Skeleton)
gen_contour_region_xld (Skeleton, Contours, 'border')
相当于对用轮廓这个像素进行了描边!但是我想取这个像素的中间值,行不行?可以的,轮廓是基于亚像素的,所以可以是半个像素。
再次调整参数,这次发现区别了:
gen_contour_region_xld (Skeleton, Contours, 'center')
应为这次区域只有一个像素,所以取center时,就是半个像素的位置,就是一条线了!这是我想要的。
这个函数,和 gen_contour_region_xld 有异曲同工之妙。
他是专门将一个像素的区域变成轮廓!所以也是先对区域进行skeleton操作。然后再进行轮廓操作。
gen_contours_skeleton_xld 和 gen_contour_region_xld 有更多的可操作性。
一下是函数的介绍:
GenContoursSkeletonXld
函数是Halcon库中的一个运算符,用于将骨架(例如边缘)转换为XLD(扩展线描述)轮廓。XLD轮廓是曲线或边缘的表示,具有附加信息,例如交叉点。以下是该运算符的参数和功能解释:
skeleton(输入对象):
contours(输出对象):
length(输入控制):
mode(输入控制):
具体信息,还请参考原始文档!
我们具体看效果:
gen_contours_skeleton_xld (Skeleton, Contours, 1, ‘filter’)
和 gen_contour_region_xld
不同 连续的区域变成轮廓之后可能会分成几段轮廓!
gen_contours_skeleton_xld (Skeleton, Contours, 5, ‘filter’)
gen_contours_skeleton_xld (Skeleton, Contours, 9, ‘generalize1’)
gen_contour_region_xld 会将连续的区域,变成连续的轮廓
而 gen_contours_skeleton_xld,会对区域分叉的地方进行特殊处理。
连续的区域变成轮廓之后可能会分成几段轮廓!
这些分叉的地方会认为是支路轮廓,根据参数进行处理!
那今天的分享就到这里,我们下次见~~~~~