Halcon 第四章『图像特征和提取』◆第5.3节:XLD轮廓处理—分割、筛选、连接or拟合

        对于检测环节来说,虽然提取出边缘或者线条,获取了线条的属性,但是这些边缘或者线条的精度和完整度并不能符合实际要求,所以还需要对轮廓做一些处理。在Halcon中,轮廓的数据结构为亚像素级的XLD轮廓,即只有轮廓类型的亚像素数据可以进行拟合。

        点击进入—轮廓的生成(链接)

        点击进入—线条的生成(链接)

        轮廓的处理流程

        输出了目标的轮廓后,接下来还需要对轮廓进行处理,这主要基于以下3个原因。

        ①分割:对于某些测量任务而言,并不需要分析目标的整个轮廓,可能只需要局部的一段轮廓。而有时由于ROI(感兴趣区域)选择得过大,因此需要对提取的轮廓进行分割,以得到所需的部分。

        ②筛选:在提取轮廓或者线条的过程中,可能会有一些杂点或者背景区域被误认为是轮廓,所以要做一些剔除,以得到完全需要的区域。

        ③连接or拟合:提取出的轮廓线条可能会有一些不连续,但实际中却需要的轮廓是闭合的,因此需要做一些连接或者填补。

        1、轮廓的分割&相关算子

        XLD轮廓处理 / Transformations转换

        分割XLD轮廓,把XLD轮廓分割成直线线段、圆弧或椭圆弧。分割后可以使用select_obj算子单独进行选择。

segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )

        Contours:输入参数,输入待分割的轮廓。

        ContoursSplit:输出参数,输出分割后的轮廓。

        Mode:输入参数,轮廓的分割模式,默认'lines_circles'。【 'lines'分割成直线段, 'lines_circles'分割成直线段和圆弧, 'lines_ellipses'分割成直线段和椭圆弧】

        SmoothCont:输入参数,对轮廓进行滤波的点数。默认5【SmoothCont == 0 || SmoothCont >= 3 && odd(SmoothCont)】

        MaxLineDist1:输入参数,对轮廓与近似线(第一次迭代运算)的最大距离。默认4.0,范围≥0.0

        MaxLineDist2:输入参数,对轮廓与近似线(第二次迭代运算)的最大距离。默认2.0,范围≥0.0

read_image(Image,'D:/Documents/Desktop/Snowcity.png')
rgb1_to_gray(Image, GrayImage)
threshold_sub_pix(GrayImage, Border, 128)
segment_contours_xld(Border, ContoursSplit, 'lines_circles', 5, 4, 2)
segment_contours_xld(Border, ContoursSplit2, 'lines_circles', 20, 4, 2)
segment_contours_xld(Border, ContoursSplit3, 'lines_circles', 5, 40, 20)
原图Snowcity
阈值提取的XLD轮廓 Border
ContoursSplit1, 'lines_circles', 5, 4, 2
ContoursSplit2, 'lines_circles', 20, 4, 2
ContoursSplit3, 'lines_circles', 5, 40, 20

         XLD 轮廓处理/ Creation创建

        通过多边形创建近似的XLD轮廓

gen_polygons_xld(Contours : Polygons : Type, Alpha : )

        Contours:输入参数,输入轮廓。

        Polygons:输出参数,输出运算后近似的多边形XLD轮廓。

        Type:输入参数,多边形近似的类型。默认 'ramer'。

        Alpha:输入参数,输入近似值的阈值。默认2.0,范围Alpha > 0.0。

read_image(Image,'D:/Documents/Desktop/Snowcity.png')
rgb1_to_gray(Image, GrayImage)
threshold_sub_pix(GrayImage, Border, 128)
gen_polygons_xld(Border, Polygons1, 'ramer', 2)
gen_polygons_xld(Border, Polygons2, 'ramer', 10)
原图Snowcity
阈值提取的XLD轮廓 Border
Polygons1, 'ramer', 3
Polygons2, 'ramer', 10

         XLD 轮廓处理/ Transformations转换

        根据特征点分割XLD轮廓

split_contours_xld(Polygons : Contours : Mode, Weight, Smooth : )

        Polygons:输入参数,输入需要分割的轮廓。

        Contours:输出参数,输出分割后的轮廓。

        Mode:输入参数,轮廓分割的模式。默认'polygon',范围【 'dominant'多边形, 'polygon'凸出】。

        Weight:输入参数,灵敏度的权重。默认1。没有推荐值(改了好像无变化)

        Smooth:输入参数,平滑掩码的宽度。默认5。没有推荐值(改了好像无变化)


read_image(Image,'D:/Documents/Desktop/Snowcity.png')
rgb1_to_gray(Image, GrayImage)
threshold_sub_pix(GrayImage, Border, 128)
gen_polygons_xld(Border, Polygons2, 'ramer', 10)
split_contours_xld(Polygons2, Contours1, 'dominant', 1, 5)
split_contours_xld(Polygons2, Contours2, 'polygon', 1, 5)
以【Polygons2, 'ramer', 10】举例
Contours1, 'dominant', 1, 5(多边形模式)
彩色部分为Contours1的轮廓
Contours2, 'polygon', 1, 5(凸出模式)
彩外圈部分为Contours2的轮廓

        gen_polygons_xld与split_contours_xld算子的组合,其操作结果类似于segment_contours_xld。

         2、轮廓的筛选&相关算子

        轮廓分割后,下一步就是如何抑制不相关的轮廓。

        XLD 轮廓处理/ Features特征

        根据特征,选择特定的亚像素轮廓或多边形。(通过指定不同特征的阈值并结合多种特征进行评估,能非常灵活地提取出理想的轮廓部分)

select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : )

        XLD:输入参数,输入要检查的轮廓或多边形。

        SelectedXLD:输出参数,输出满足条件的轮廓或多边形。

        Features:输入参数,提取XLD的特征依据。

 'anisometry', 椭圆参数,Ra/Rb长轴与短轴的比值,即椭圆长半轴与短半轴的比值。

'anisometry_points',

'area', '轮廓内的面积的区间。

'area_points',

'contlength',轮廓线总长度

'bulkiness', 椭圆参数,蓬松度π*Ra*Rb/A。

'circularity',轮廓的圆度,范围0.0-1.0。

'convexity',凸性,范围0-1。

'compactness',输入区域的紧密度【圆形的紧密度为1,Compactness >= 1.0 或 Compactness == 0】

'width'输入区域的宽度(平行于坐标轴)

'height',输入区域的高度(平行于坐标轴)

'row', 轮廓的中心行坐标在图像中的的Max和Min行坐标之间的。

'column',轮廓的中心列坐标在图像中的的Max和Min列坐标之间的。

'row1','轮廓左上角的行坐标在图像中的的Max和Min行坐标之间的。

'row2',轮廓右下角的行坐标在图像中的的Max和Min行坐标之间的。

'column1',轮廓左上角列坐标在图像中的的Max和Min行坐标之间的。

'column2',轮廓右下角列坐标在图像中的的Max和Min行坐标之间的。

'column_points',

'row_points',

'max_diameter',轮廓线的最大直径

'moments_m02',

'moments_m02_points',

'moments_m11',

'moments_m11_points',

'moments_m20',

'moments_m20_points',

'orientation',轮廓的方向。

'orientation_points',轮廓的点方向。

'outer_radius',最小外接圆半径。

'ratio',轮廓的宽高比

'phi',等效椭圆方向

'phi_points',

'ra',等效椭圆长轴半径长度,

'ra_points',

'rb',等效椭圆短轴半径长度,

'rb_points',

'rect2_len1',最小外接矩形长度的一半。

'rect2_len2',最小外接矩形长度的一半。

'rect2_phi',最小外接矩形的方向。

'struct_factor',椭圆结构参数,结构因子。

        Operation:输入参数,特征之间的逻辑关系,默认  'and',范围'and', 'or'。

        Min:输入参数,特征值的要求范围,输入该特征的下限或最小值。【0.0 ≤ Min ≤ 99999.0】

        Max:输入参数,特征值的要求范围,输入该特征的上限或最大值。【Max >= Min】

read_image(Image,'D:/Documents/Desktop/Snowcity.png')
rgb1_to_gray(Image, GrayImage)
threshold_sub_pix(GrayImage, Border, 128)
*选择XLD轮廓线内面积在1000-3000之间的
select_shape_xld(Border, SelectedXLD1, 'area', 'and', 1000, 3000)
*选择XLD轮廓线圆度在0.8-1之间的
select_shape_xld(Border, SelectedXLD2, 'circularity', 'and', 0.8, 1)
*选择XLD轮廓线紧密度在2-5之间的
select_shape_xld(Border, SelectedXLD3, 'compactness', 'and', 2, 5)
*选择XLD轮廓线的中心点行坐标在图像行坐标0-220之间的
select_shape_xld(Border, SelectedXLD4, 'row', 'and', 0, 220)
*选择XLD轮廓线的周长长度在200-400之间的
select_shape_xld(Border, SelectedXLD5, 'contlength', 'and', 200, 400)
提取出的XLD轮廓,Border
选择XLD轮廓线内面积在1000-3000之间的—SelectedXLD1
选择XLD轮廓线圆度在0.8-1之间的—SelectedXLD2
选择XLD轮廓线紧密度在2-5之间的—SelectedXLD3
XLD轮廓线中心点行坐标在图像行坐标0-220之间的
SelectedXLD4
选择XLD轮廓线的周长长度在200-400之间的
SelectedXLD5

        XLD 轮廓处理/ Features特征

        根据不同的特征选择XLD轮廓(包含了更多线性结构的典型特征)

select_contours_xld(Contours : SelectedContours : Feature, Min1, Max1, Min2, Max2 : )

        Contours:输入参数,输入XLD轮廓。

        SelectedContours:输出参数,输出XLD轮廓。

        Feature:输入参数,选择轮廓的特征,

【 

'closed',封闭的轮廓,只有起始点和终点之间的距离小于或等于Max1像素的轮廓才会被返回。(Min1, Min2和Max2在这里没有影响。)

'contour_length',轮廓长度,所有长度小于Min1或大于Max1的轮廓线都不会返回(Min2和Max2在这里没有影响)。

curvature',弯曲度,仅返回到回归线的平均距离在Min1和Max1之间,且距离的标准差在Min2和Max2之间的等高线。

'direction',方向,只有方向在Min1和Max1之间(以弧度为单位,逆时针)的轮廓才会被返回。(Min2和Max2在这里没有影响)。

'maximum_extent',最大面积,所有面积小于Min1或大于Max1的轮廓线都不会返回(Min2和Max2在这里没有影响)。

'open',未封闭的轮廓,只有起始点和终点之间的距离大于Min1像素的轮廓才会被返回。(Max1, Min2和Max2在这里没有影响)。如果使用Min1 = Max1 = 0或Min2 = Max2 = 0来根据曲率进行选择,则各自的特征对选择没有影响。

        Min1:输入参数,阈值下限。默认0.5。

        Max1:输入参数,阈值上限。默认200.0。

        Min2:输入参数,阈值下限。默认-0.5。

        Max2:输入参数,阈值上限。默认0.5。

        XLD 轮廓处理/ Features特征

        选择包含指定像素的所有轮廓和多边形(也可以选择其他算子用鼠标进行交互操作,如实时选择一些轮廓来确定坐标)

select_xld_point(XLDs : DestXLDs : Row, Column : )

        XLDs:输入参数,输入轮廓(合集)或多边形(合集)。

        DestXLDs:输出参数,输出包含了指定像素的输入轮廓(合集)或多边形(合集)。

        Row:输入参数,输入检测点的y值坐标。

        Column :输入参数,输入检测点的x值坐标。

        3.1、轮廓的连接&相关算子

        如果轮廓的线条是不连续的,那么断开的部分会被当成独立的部分,后续的处理过程会更加麻烦。这时可以试着将断开的部分连接起来。

        XLD轮廓处理 / Transformations转换

        合并位于同一条直线上的轮廓(适用于共线的连接)

union_collinear_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, MaxShift, MaxAngle, Mode : )

        Contours:输入参数,输入XLD轮廓。

        UnionContours:输出参数,输出合并后的XLD轮廓。

        MaxDistAbs:输入参数,最大距离,两轮廓结束点之间的最大距离。

        MaxDistRel:输入参数,最大距离系数,两轮廓邻近端点之间的最大(缝隙)距离。相对于参考轮廓线的长度,两条轮廓线之间的最大间隙长度,均沿参考轮廓的回归线测量。

        MaxShift:输入参数,最大垂直距离,一条斜线的起点和终点,平行于坐标轴的最大垂直距离。

        MaxAngle:输入参数,最大角,两条轮廓回归线之间的最大夹角,单位弧度。【 0.0 ≤ MaxAngle ≤ 0.78539816339】

        Mode:输入参数,是否保留没有合并的其他线段。【'attr_forget'忽略, 'attr_keep'保留】

        XLD轮廓处理 / Transformations转换

        合并具有相似方向的相邻直线轮廓(适用于同方向的邻近轮廓)

union_straight_contours_xld(Contours : UnionContours : MaxDist, MaxDiff, Percent, Mode, Iterations : )

        XLD轮廓处理 / Transformations转换

        合并终点连接在一起的轮廓(适用于端点邻近的情况)

union_adjacent_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, Mode : )

read_image (Image, 'pads')
get_image_size (Image, Width, Height)
dev_set_colored (12)
dev_set_draw ('margin')

* edges_sub_pix (Image, Edges, 'lanser2', 0.16, 3, 5)
*提取XLD轮廓
edges_sub_pix (Image, Edges, 'canny', 5, 3, 5)
*分割轮廓为线形
segment_contours_xld (Edges, ContoursSplit, 'lines', 5, 4, 2)
*根据周长特征选择轮廓
select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 20, Width / 2, -0.5, 0.5)
*合并位于同一条直线上的轮廓
union_collinear_contours_xld (SelectedContours, UnionContours, 10, 1, 8, 0.4, 'attr_keep')
select_contours_xld (UnionContours, SelectedContours1, 'contour_length', 50, 10000, -0.5, 0.5)
dev_display (Image)
dev_display (SelectedContours1)
stop ()
*合并终点连接在一起的轮廓
union_adjacent_contours_xld (SelectedContours1, UnionContours1, 20, 1, 'attr_keep')
*最小的外接矩形,可任意方向
smallest_rectangle2_xld (UnionContours1, Row, Column, Phi, Length1, Length2)
*根据上面的坐标画出矩形
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
stop ()
原图pads
edges_sub_pix算子提取XLD轮廓 Edges
segment_contours_xld分割轮廓,分割成线型lines
select_contours_xld,根据轮廓长度选择
union_collinear_contours_xld 合并位于同一条直线上的轮廓
select_contours_xld,根据轮廓长度再次筛选
dev_display (Image)
dev_display (SelectedContours1)
union_adjacent_contours_xld合并终点连接在一起的轮廓
UnionContours1
最小外接矩形,有角度

         XLD轮廓处理 / Transformations转换

        改变轮廓或多边形的形状(用于修改形状,把轮廓转换成包围的圆或者矩形等)

shape_trans_xld(XLD : XLDTrans : Type : )

        XLD:输入参数,输入要变换的轮廓或多边形。

        XLDTrans:输出参数

        Type:输入参数

【 'convex',凸壳。

'ellipse', 椭圆,与输入轮廓或多边形具有相同矩长和面积的椭圆。

'outer_circle', 最小外接圆。

'rectangle1', 平行于坐标轴的最小外接矩形。

'rectangle2'最小外接矩形,任意方向。

'convex',凸壳
'ellipse', 椭圆
'outer_circle'最小外接圆
'rectangle1', 平行于坐标轴的最小外接矩形

        XLD / Sets

        闭合轮廓的并集(合并闭合轮廓)

union2_closed_contours_xld(Contours1, Contours2 : ContoursUnion : : )

Contours1:输入参数,输入封闭轮廓1。

Contours2:输入参数,输入封闭轮廓2。

ContoursUnion:输出参数,输出以上两者的并集。

如果单个的输入轮廓不闭合,则通过连接它们的起点和终点,它们会自动闭合。

两组参数
并集

         3.2、轮廓的拟合&相关算子

        上面得到的轮廓有的是不规则的,实际检测中可能需要将其进行拟合,以得到规则的轮廓,便于后续处理。

        ①拟合直线

        在拟合直线的时候,通常使用最小二乘法,即计算每个点到拟合的直线的距离,使得每个点到直线的距离的平方和最小。

        权重函数有很多,其中,图基'tukey'和胡贝尔'huber'权重使用最多。

        在胡贝尔权重中对于离群值依然会存在较小的权重,如果离群值过大,也会对拟合产生影响,这个时候可以考虑图基权重。

        XLD / Features

        拟合直线。(配合gen_contour_polygon_xld算子可以查看直线的显示结果)

fit_line_contour_xld(Contours : : Algorithm, MaxNumPoints, ClippingEndPoints, Iterations, ClippingFactor : RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)

        Contours:输入参数,输入一个需要拟合的线。

        Algorithm:输入参数,拟合的算法。默认'tukey'。

'drop',最小二乘拟合,其中的离群值被忽略的方式为:如果点到直线的距离大于所有轮廓线的点到直线的距离的均值乘以距离阈值因子的值,则该点会被忽略。

'gauss',加权最小二乘直线拟合,根据所有轮廓点到拟合线距离的平均值和标准差减少离群点的影响。

'huber',加权最小二乘指尖拟合,其中根据胡贝尔的方法减少了离群值的影响。

'regression',标准的最小二乘拟合。

'tukey',加权最小二乘直线拟合,其中根据图基的方法减少了离群值的影响。

        MaxNumPoints:输入参数,参与拟合的点的个数。默认-1表示所有的点都参数。范围≥2。

        ClippingEndPoints:输入参数,裁剪首尾点的个数。默认0。范围≥0。

        Iterations:输入参数,最大迭代次数(即重复计算的次数)。默认5,范围≥0。

        ClippingFactor:输入参数,距离阈值的因子(消波因数)。默认2.0,参考:1.0,1.5,2.0,2.5,3.0,范围>0。

        RowBegin:输出参数,输出拟合直线起始点的行y坐标。

        ColBegin:输出参数,输出拟合直线起始点的列x坐标。

        RowEnd:输出参数,输出拟合直线结束点的行y坐标。

        ColEnd:输出参数,输出拟合直线结束点的列x坐标。

        Nr:输出参数,线参数,行方向向量。

        Nc:输出参数,线参数,列方向向量。

        Dist:输出参数,输出线的距离,即直线到原点的距离(图像原点到这条直线的距离)。

        XLD / Creation

        根据一个多边形(以元组形式给出)创建一个XLD轮廓

gen_contour_polygon_xld( : Contour : Row, Col : )

        Contour:输出参数,输出产生的轮廓。

        Row:输入参数,多边形的行坐标。格式:[RowBegin[0],RowEnd[0]]

        Col:输入参数,多边形的列坐标。格式:[ColBegin[0],ColEnd[0]]

read_image(Image,'D:/Documents/Desktop/Snowcity.png')
rgb1_to_gray(Image, GrayImage)

*threshold (GrayImage, Regions, 0, 225)
*compactness(Regions, Compactness)

threshold_sub_pix(GrayImage, Border, 128)
segment_contours_xld(Border, ContoursSplit, 'lines', 5, 4, 2)
union_collinear_contours_xld(ContoursSplit, UnionContours, 10, 1, 8, 0.4, 'attr_keep')

fit_line_contour_xld(UnionContours, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)

gen_contour_polygon_xld(Contour1, [RowBegin[0],RowEnd[0]],[ColBegin[0],ColEnd[0]])
gen_contour_polygon_xld(Contour2, [RowBegin[1],RowEnd[1]],[ColBegin[1],ColEnd[1]])
原图Snowcity
threshold_sub_pix提取XLD轮廓Border
应该有两条(图像被压缩的原因放大后只能显示一条)
segment_contours_xld分割出直线
union_collinear_contours_xld合并后的轮廓
2个轮廓的相关参数
拟合后的直线,Contour1和Contour2
(图像被压缩的原因放大后只能显示一条)

        ②拟合圆

        拟合圆是把一系列的点拟合为一个圆形。拟合的思路和拟合直线相似,即计算轮廓上的点到拟合圆的距离的平方,然后再把所有的距离进行连加求和,最后对这个求和的值求最小化。 权重分为胡贝尔和图基,方式与直线拟合相同。但是在一些极限的情况下,拟合圆也需要使用到RANSAC算法。

        XLD / Features

        拟合圆。根据一个类似于圆(或圆弧)的等高线轮来提取一个标准圆

fit_circle_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, Iterations, ClippingFactor : Row, Column, Radius, StartPhi, EndPhi, PointOrder)

        Contours:输入参数,输入一个需要拟合的线轮廓。

        Algorithm:输入参数,圆拟合的算法。默认 'algebraic'。

 'ahuber', 该方法为最小二乘法计算,计算的距离为代数距离。权重基于胡贝尔方法对轮廓点进行加权,以减少异常点的影响。

'algebraic', 该方法为最小二乘法计算,计算的距离为代数距离。

'atukey', 该方法为最小二乘法计算,计算的距离为代数距离。权重基于图基方法对轮廓点进行加权,以减少异常点的影响。

'geohuber', 该方法为最小二乘法计算,计算的距离为几何距离。权重基于胡贝尔方法对轮廓点进行加权,以减少异常点的影响。距离度量在统计上是最优的,但需要更多的计算时间。如果轮廓点被噪声严重扭曲,推荐使用这种方法。

'geometric', 该方法为最小二乘法计算,计算的距离为几何距离。

'geotukey',该方法为最小二乘法计算,计算的距离为几何距离。权重基于图基方法对轮廓点进行加权,以减少异常点的影响。

        MaxNumPoints:输入参数,参与拟合的点的个数。默认-1表示所有的点都参数。范围≥3。

        MaxClosureDist:输入参数,被认为“闭合”的轮廓端点之间的最大距离。默认0.0,范围≥0。

        ClippingEndPoints:输入参数,裁剪首尾点的个数。默认0,范围≥0。

        Iterations:输入参数,最大迭代次数(重复计算的次数)。默认3,范围≥0。

        ClippingFactor:输入参数,距离阈值的因子(消波因数)。默认2.0,参考:1.0,1.5,2.0,2.5,3.0,范围>0。

        Row:输出参数,圆心的行y坐标。

        Column:输出参数,圆心的列x坐标。

        Radius:输出参数,圆的半径。

        StartPhi:输出参数,起始点的圆角度。

        EndPhi:输出参数,结束点的圆角度。

        PointOrder:输出参数,沿边界点序,即旋转的方向。【'negative'顺时针, 'positive'逆时针】

        XLD /Creation

        创建一个圆或圆弧轮廓

gen_circle_contour_xld( : ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder, Resolution : )

        ContCircle:输出参数,输出由圆或圆弧所产生的轮廓。

        Row:输入参数,圆或圆弧圆心的行y坐标。

        Column:输入参数,圆心或圆弧的列x坐标。

        Radius:输入参数,输入圆或圆弧的半径。范围>0。

        StartPhi:输入参数,输入圆或圆弧的起始角度。默认0.0。

        EndPhi:输入参数,输入圆或圆弧的终止角度。默认6.28318。

        PointOrder:输入参数,沿着圆或圆弧的点顺序。【'negative'顺时针, 'positive'逆时针】

        Resolution:输入参数,分辨率,等高点之间的间距。默认1.0,范围≥0.00001。

read_image(Image,'D:/Documents/Desktop/Snowcity.png')
rgb1_to_gray(Image, GrayImage)

threshold_sub_pix(GrayImage, Border, 128)

fit_circle_contour_xld(Border, 'geohuber', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, StartPhi)

gen_circle_contour_xld(ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1)
原图
创建的圆形轮廓
*直接创建一个圆或者圆弧
gen_circle_contour_xld(ContCircle1, 200, 200, 100, 0, 5.28318, 'negative', 1)
dev_set_color('green')
gen_circle_contour_xld(ContCircle1, 100, 100, 100, 0, 5.28318, 'positive', 1)

        ③拟合矩形 

        XLD / Features

        拟合矩形。

fit_rectangle2_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, Iterations, ClippingFactor : Row, Column, Phi, Length1, Length2, PointOrder)

        Contours:输入参数,输入一个轮廓。

        Algorithm:输入参数,拟合矩形的算法。默认 'regression'。

'huber', 加权最小二乘指尖拟合,其中根据胡贝尔的方法减少了离群值的影响。

'regression',标准的最小二乘拟合。

'tukey',加权最小二乘直线拟合,其中根据图基的方法减少了离群值的影响。

】。

        MaxNumPoints:输入参数,参与拟合的点的个数。默认-1表示所有的点都参数。范围MaxNumPoints == -1 || MaxNumPoints ≥ 8。

        MaxClosureDist:输入参数,被认为“闭合”的轮廓端点之间的最大距离。默认0.0,范围≥0。

        ClippingEndPoints:输入参数,裁剪首尾点的个数。默认0,范围≥0。

        Iterations:输入参数,最大迭代次数(重复计算的次数)。默认3,范围≥0。

        ClippingFactor:输入参数,距离阈值的因子(消波因数)。默认2.0,参考:1.0,1.5,2.0,2.5,3.0,范围>0。

        Row:输出参数,输出矩形中心的行x坐标。

        Column:输出参数,输出矩形中心的列y坐标。

        Phi:输出参数,输出长轴与水平方向的角度。

        Length1:输出参数,输出长轴半径。

        Length2:输出参数,输出短轴半径。

        PointOrder:输出参数,旋转的方向。默认'positive'。【'negative'顺时针, 'positive'逆时针】

        XLD / Creation

        创建一个矩形XLD轮廓

gen_rectangle2_contour_xld( : Rectangle : Row, Column, Phi, Length1, Length2 : )

        Rectangle:输出参数,输出矩形轮廓。

        Row:输入参数,矩形中心的行x坐标。

        Column:输入参数,矩形中心的列y坐标。

        Phi:输入参数,长轴与水平方向的角度。默认0.0,范围:- pi / 2 < Phi && Phi <= pi / 2

        Length1:输入参数,长轴半径。

        Length2:输入参数,短轴半径。

        ④拟合椭圆 

        拟合椭圆是把点集拟合成椭圆,拟合的原理和拟合直线、拟合圆的方式一致,是点集的点到拟合的椭圆的距离的平方和的最小值。表示椭圆使用是椭圆的隐式表达式。

        XLD / Features

        拟合椭圆。

fit_ellipse_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, VossTabSize, Iterations, ClippingFactor : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder)

        Contours:输入参数,输入一个需要拟合的线轮廓。

        Algorithm:输入参数,拟合椭圆的算法。默认'fitzgibbon'。

'fhuber', 这种方法计算的是代数距离,基于胡贝尔权值对轮廓点进行加权,以减少异常点的影响。

'fitzgibbon', 这种方法计算的是代数距离,约束条件4ac-b²=1保证得到的多项式描述的是椭圆,而不是双曲线或抛物线。

'focpoints', 这种方法计算的是焦点距离,然后通过最小二乘法求取椭圆的参数。

'fphuber',这种方法计算的是焦点距离,基于胡贝尔方法进行了加权的最小二乘优化,以减少异常值的影响。

'fptukey', 这种方法计算的是焦点距离,基于图基方法进行了加权的最小二乘优化,以减少异常值的影响。

'ftukey', 这种方法计算的是代数距离,基于图基权值对轮廓点进行加权,以减少异常点的影响。

'geohuber', 这种方法计算是集合距离,基于胡贝尔权值对轮廓点进行加权,以减少异常点的影响。

'geometric', 这种方法计算是集合距离,这种距离测量在统计上是最优的,但是需要更多的计算时间。

'geotukey', 这种方法计算是集合距离,基于图基权值对轮廓点进行加权,以减少异常点的影响。

'voss',每个输人轮廓在仿射标准位置进行变换。根据变换后的轮廓(即封闭图像区域)的矩,选择标准圆段,其标准位置与轮廓的标准位置最匹配。利用仿射变换对所选圆段的标准位置对应的椭圆进行再变换,得到与原轮廓匹配的椭圆的标准位置。VossTabSize参数用于此计算。为了加快处理速度,在第一次调用fit_ellipse_ contour_ xld 时创建的表中存储了相应的矩表和其他数据。

        MaxNumPoints:输入参数,参与拟合的点的个数。默认-1表示所有的点都参数,范围≥5。

        MaxClosureDist:输入参数,被认为“闭合”的轮廓端点之间的最大距离。默认0.0,范围0。

        ClippingEndPoints:输入参数,在开始和结束时的点的数量将被忽略拟合(裁剪首尾点的个数)。默认0,范围≥0。

        VossTabSize:输入参数,存储沃斯算法的圆形段的数量。默认:200。范围VossTabSize≥25 && VossTabSize≤5000。

        Iterations:输入参数,最大迭代次数(重复计算的次数)。默认3,范围≥0。

        ClippingFactor:输入参数,距离阈值的因子(消波因数)。默认2.0,参考:1.0,1.5,2.0,2.5,3.0,范围>0。

        Row:输出参数,椭圆中心的行x坐标。

        Column:输出参数,椭圆中心的列y坐标。

        Phi:输出参数,输出长轴与水平方向的角度。

        Radius1:输出参数,输出长轴半径。

        Radius2:输出参数,输出短轴半径。

        StartPhi:输出参数,输出椭圆圆弧起始角度。

        EndPhi:输出参数,输出椭圆圆弧的终止角度。

        PointOrder:输出参数,选择的方向。默认:'positive'。【'negative'顺时针, 'positive'逆时针】

        XLD / Creation

        根据相应的椭圆弧创建一个XLD轮廓

gen_ellipse_contour_xld( : ContEllipse : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder, Resolution : )

        ContEllipse:输出参数,输出椭圆轮廓。

        Row:输入参数,椭圆中心的行x坐标。

        Column:输入参数,椭圆中心的列y坐标。

        Phi:输入参数,长轴与水平方向的角度。默认0.0。

        Radius1:输入参数,长轴半径。默认100.0,范围Radius1 > 0。

        Radius2:输入参数,短轴半径。默认:50.0,范围Radius2 >= 0 && Radius2 <= Radius1。

        StartPhi:输入参数,椭圆圆弧起始角度。默认0.0。

        EndPhi:输入参数,椭圆圆弧的终止角度。默认6.28318。

        PointOrder:输入参数,选择的方向。默认:'positive'。【'negative'顺时针, 'positive'逆时针】

        Resolution:输入参数,分辨率,等高点之间的间距。默认1.5,范围Resolution >= 1.192e-7。

参考文献:

杨青—《Halcon机器视觉算法原理与编程实战》

杜斌—《机器视觉 使用HALCON描述与实现》

说说常用算子select_shape的特性一些使用https://www.cnblogs.com/eyesonchip/p/13698031.html

初学者系列:halcon(四) XLD (亚像素精度)https://www.jianshu.com/p/52030bc6bdc3

halcon中XLD的概念及算子应用https://blog.csdn.net/weixin_42258743/article/details/107427493

猜你喜欢

转载自blog.csdn.net/qq_45336030/article/details/123976623