一、提要
花了很久实践才搞清楚get_contour_attrib_xld和get_contour_global_attrib_xld两个算子的真实意图,搞明白后觉得halcon的帮助文章似乎就那么故弄玄虚,多这么一个小小文章,不就一切都解决了吗?
二、导火线
2.1 曲边的四个类型
导致我不明白的是若干关联操作的顺序没有理清楚,这里先叙述我把关系理清楚的结果:
首先是一个回归算子regress_contours_xld这是一个什么算子?
他是一个对曲边进行回归拟合的算子,注意,这里嵌套一个曲边的概念。所谓曲边包含三种:
- 类线段曲边
- 类圆弧曲边
- 类椭圆曲边
- 不规则曲边
类线段、类圆弧、类椭圆三种曲边用,'cont_approx'属性完成鉴别,比如:
get_contour_global_attrib_xld(Contour : :'cont_approx' : Attrib)
就是判别attrib为(-1,0,1)对应(直线,圆弧,椭圆弧)
那么剩下不规则曲边如何处理呢?
2.2 不规则曲边的处理法
不规则曲边首先进行回归:
regress_contours_xld — 计算回归线到 XLD 轮廓的参数。
如何回归呢?参见该文《【图像处理】道格拉斯-普克算法(曲线的折线段逼近)》
三、regress_contours_xld
regress_contours_xld 计算输入 XLD 轮廓 Contours 的以下参数,并将它们与生成的轮廓一起存储为全局属性:
- 回归线的法线向量的坐标,即所有轮廓点的最小二乘近似线;
- 法线向量总是从原点指向线(属性:'regr_norm_row','regr_norm_col'), 轮廓点与回归线的欧几里得距离的平均值(属性:'regr_mean_dist'), 这些距离到回归线的标准偏差(属性:'regr_dev_dist')。
对于Mode = 'no',对轮廓的所有点计算回归线的参数。此外,可以应用三种不同的异常值处理。异常值是在一个轮廓中不位于一般轮廓方向上的轮廓点。 “明显”的方式,从而“扭曲”得到的回归线。
模式 =
- 'drop':在计算未失真的回归线时,所有距离轮廓比回归线平均距离更远的轮廓点都将被忽略。
- 'gauss':轮廓点的距离根据它们在正态回归线周围的高斯分布中出现的概率进行加权。
- '中位数':在这里,对于到正态回归线的距离也假设为正态分布,但是与异常值无关的标准偏差 {median(all dist.)}over(0.6745)。同样,距离是加权的,并且对于未失真的回归线,将忽略比特定距离更远的点。
未失真回归线的计算可以迭代多次(Iterations)
1)算子格式
regress_contours_xld(Contours : RegressContours : Mode, Iterations : )
2)参数解释
- Contouchu:输入曲线簇
- Mode:回归方式选择
- Iterations:迭代次数
- RegressContours:输出回归处理后曲边簇
处理后曲线大致模样:
这里才引出get_contour_global_attrib_xld和get_contour_attrib_xld两个算子。其中,
get_contour_global_attrib_xld是对整个折线的全局进行度量,get_contour_attrib_xld对局部进行度量:
如题,左侧是全局度量,表明偏差的最大值、平均值等(get_contour_global_attrib_xld)。
右侧是局部度量,指当前折线的方向、幅度、转折角。比如,图上有8个点,将返回8个点的angle、rsponse,direct。(get_contour_attrib_xld)。
四、边线全局属性get_contour_global_attrib_xld
get_contour_global_attrib_xld返回Attrib中XLD轮廓Contour的全局属性Name的值。全局属性是为每个轮廓定义的附加值,例如,轮廓回归线的法向量('regr_norm_row'和'regr_norm_col '). 定义此类属性包含对定义值的名称和语义的描述。query_contour_global_attribs_xld 可用于查询为特定轮廓定义了哪些属性。
描述:get_contour_global_attrib_xld返回XLD轮廓的全局属性名的值,全局属性是为每个轮廓定义的附加值;
1)算子格式
get_contour_global_attrib_xld(Contour : : Name : Attrib)
2)参数解释
Name:是以下属性名称之一,Attrib是该名称属性对应的值:
'regr_norm_row', 'regr_norm_col', 'regr_mean_dist', 'regr_dev_dist', 'cont_approx', 'bright_dark', 'is_hole'
1、'regr_norm_row'
回归线单位法向量的行坐标,法向量从原点指向该线。可见算子regress_contours_xld,计算回归线到XLD轮廓的参数。
2、 'regr_norm_col'
回归线单位法向量的列坐标,法向量从原点指向该线。可见算子regress_contours_xld,计算回归线到XLD轮廓的参数。
3、'regr_mean_dist'
包含每个等高线点到回归线之间的欧式距离的平均值。可见算子regress_contours_xld,计算回归线到XLD轮廓的参数。
4、'regr_dev_dist'
轮廓线点与回归线之间(欧几里得)距离的标准差。可见算子regress_contours_xld,计算回归线到XLD轮廓的参数。
5、'cont_approx'
* 如果'cont_approx'=-1,这一部分轮廓最适合被拟合为直线段。
* 如果'cont_approx'=0,这一部分轮廓最适合被拟合为椭圆弧。
* 如果'cont_approx'=1,这一部分轮廓最适合被拟合为圆弧。
可见算子regress_contours_xld,计算回归线到XLD轮廓的参数。
6、'bright_dark'
可见算子connect_grid_points,建立整流网各网格点之间的连接。还有历程
grid_rectification.hdev
每个输出XLD轮廓的转换类型存储在属性“bright_dark”中。如果连接线形成明暗转换(从左到右,从起点到终点),则将其设置为1.0,否则将其设置为0.0。
示例性XLD轮廓(红色和绿色)沿着整流网格的边缘(从起点到终点的方向由箭头指示)。转换类型存储在属性“bright_dark”中,红色轮廓为1.0,绿色轮廓为0.0。
7、'is_hole'
判断是否是包含孔的边界,'is_hole'设置为1,是包含孔的边界;否则设置为0。
五、边线折线的局部属性get_contour_attrib_xld
get_contour_attrib_xld返回Attrib中XLD轮廓Contour的属性Name的值。属性是为每个轮廓点定义的附加值,例如,垂直于轮廓的方向('角度')。定义这种类型的运算符属性,例如lines_gauss 和edges_sub_pix,包含对定义值的名称和语义的描述。query_contour_attribs_xld 可用于查询为特定轮廓定义了哪些属性。
1)算子格式
get_contour_attrib_xld(Contour : : Name : Attrib)
2)参数说明
Name:是下列属性名称之一,Attrib是获取的该名称所指属性的值。
默认: 'angle',即线段的角度
Suggested values: 'angle', 'edge_direction', 'width_right', 'width_left', 'response', 'contrast', 'asymmetry', 'distance'
六、实验程序代码
read_image (Image, 'mreut')
edges_sub_pix (Image, Edges, 'canny', 2, 20, 40)
*
* Then, to create global attributes, the regression lines are determined.
regress_contours_xld (Edges, RegressContours, 'no', 1)
select_contours_xld(RegressContours, SelectedContours, 'contour_length', 0.5, 50, -0.5, 0.5)
*
* Now, we can query what attributes and global attributes
* are available for the contours.
set_color(3600, 'red')
count_obj(SelectedContours, Number)
for Index:=1 to Number by 1
select_obj (RegressContours, ObjectSelected, Index)
query_contour_attribs_xld (ObjectSelected, Attribs)
query_contour_global_attribs_xld (ObjectSelected, GlobalAttribs)
get_contour_attrib_xld(ObjectSelected, Attribs[0], Attrib_0)
get_contour_attrib_xld(ObjectSelected, Attribs[1], Attrib_1)
get_contour_attrib_xld(ObjectSelected, Attribs[2], Attrib_2)
get_contour_global_attrib_xld(ObjectSelected, GlobalAttribs[0], Attrib0)
get_contour_global_attrib_xld(ObjectSelected, GlobalAttribs[1], Attrib1)
get_contour_global_attrib_xld(ObjectSelected, GlobalAttribs[2], Attrib2)
get_contour_global_attrib_xld(ObjectSelected, GlobalAttribs[3], Attrib3)
get_contour_global_attrib_xld(ObjectSelected, GlobalAttribs[4], Attrib4)
* dev_clear_window()
disp_xld(ObjectSelected,3600)
endfor