fit_ellipse_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, VossTabSize, Iterations, ClippingFactor : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder)
fit_ellipse_contour_xld用椭圆圆弧或闭合椭圆逼近XLD轮廓线。
它不执行输入轮廓的分割。
因此,必须确保每个轮廓对应一个且仅对应一个椭圆结构。
操作符返回每个轮廓的中心(Row, Column)、主轴的方向Phi、较大的半轴Radius1的长度,较小的半轴Radius2的长度。
此外,椭圆弧还返回了与起点和终点StartPhi、EndPhi和沿边界的点阶PointOrder。
对于闭合椭圆,这些参数设置为0、2*pai,和“positive”。
椭圆拟合的算法可以通过Algorithm来选择:
fitzgibbon
这种方法使代数距离最小化
2019-05-23_110423.jpg (2.35 KB, 下载次数: 1)
2019-5-23 16:49 上传
在轮廓线点(xi,yi)和生成的椭圆之间。
约束4ac - b^2 = 1保证得到的多项式描述的是椭圆(而不是双曲线或抛物线)。
fhuber
类似于“fitzgibbon”。这里根据Huber方法对轮廓点进行加权,
以减小异常点的影响(见下)。
ftukey
类似于“fitzgibbon”。这里根据Tukey的方法对轮廓点进行加权,
忽略异常值(见下)。
geometric
这种方法使轮廓线点与最终椭圆之间的几何距离最小化。
距离测量在统计上是最优的,但由于计算是一个迭代的过程,
需要更多的计算时间。
如果轮廓线点被噪声严重扭曲,建议使用此选项。
geohuber
类似于“geometric”。这里根据Huber方法对轮廓点进行加权,以减小异常点的影响(见下)。
geotukey
类似于“几何”。这里根据Tukey的方法对轮廓点进行加权,忽略异常值(见下)。
voss
每个输入轮廓在仿射标准位置进行转换。
根据变换后的轮廓(即封闭图像区域)的矩值,
选择标准圆段,其标准位置与轮廓的标准位置最匹配。
在仿射变换的基础上对所选圆段的标准位置对应的椭圆进行再变换,
仿射变换产生轮廓的标准位置,从而使椭圆与原轮廓匹配。
VossTabSize标准圆段用于此计算。
为了加快处理速度,对应的力矩和其他数据存储在一个表中,
这个表是在第一次调用fit_ellipse_contour_xld时创建的(VossTabSize有一个特定的值)。
focpoints
椭圆上的每个点P都满足到焦点(f1,f2)距离之和等于较大半轴a长度的两倍的约束条件。
该方法通过最小二乘优化,使所有轮廓点的偏差pf1+pf2-2a最小。
fphuber
类似于“focpoints”。本文采用加权最小二乘优化方法,
在Huber方法的基础上减小了异常值的影响(见下文)。
fptukey
类似于“focpoints”。本文采用加权最小二乘优化方法,
忽略异常值(见下)。
对于“*huber”和“*tukey”,使用鲁棒误差统计量来估计从轮廓点到距离的标准差,
而没有离群点到近似椭圆的距离。
参数ClippingFactor(标准偏差的比例因子)控制异常值的数量:
为ClippingFactor选择的值越小,分类为异常值的点越多。
在拟合过程中,每个等高线点都被单独加权,
并根据其权重进行贡献。
鲁棒加权和拟合的集合可以迭代。
迭代的总数由Iterations给出。
该参数对除基于几何距离的两种算法外的所有算法均有相关性,
即“geohuber”和“geotukey”,其中忽略该参数。
如果算法在此迭代次数内没有找到拟合椭圆,则拟合直线;
在这种情况下,Radius2是零。在Tukey算法中,异常值被删除,
而在Huber算法中,异常值只被阻尼,或者更精确地说,它们是线性加权的。
在不进行鲁棒加权的情况下,将距离的平方和作为误差值进行优化,即采用最小二乘公式。
在实践中,推荐了Tukey的方法。
为了减少计算量,椭圆的拟合可以限制在轮廓点的一个子集内:
如果MaxNumPoints分配的值不是-1,
那么只使用MaxNumPoints(均匀分布在轮廓上)。
对于椭圆圆弧,选取椭圆上最接近原始轮廓起点和终点的点作为起点和终点。
与椭圆主轴对应的角在StartPhi和EndPhi中返回,也参见gen_ellipse_contour_xld。
对于起点和终点之间的距离小于或等于MaxClosureDist的轮廓线,则认为轮廓线是闭合的。
因此,它们用椭圆代替椭圆弧来近似。
“focpoints”算法比开放轮廓算法更快、更不精确地确定了封闭轮廓优化的初始参数。
因此,在某些情况下,当应用于闭合轮廓时,可能需要更多的迭代。
由于预处理中的伪影,轮廓的起点和终点可能会出现错误。
因此,可以从椭圆的拟合中排除轮廓的起点和终点处的裁剪端点。
然而,它们仍然用于StartPhi和EndPhi的测定。
拟合椭圆所需的最小轮廓点个数为5。因此,要求轮廓点的个数至少为5+2*ClippingEndPoints
例程
read_image (Image, 'caltab')
find_caltab (Image, CalPlate, 'caltab_800mm.descr', 3, 112, 5)
reduce_domain (Image, CalPlate, ImageReduced)
edges_sub_pix (ImageReduced, Edges, 'lanser2', 0.5, 20, 40)
select_contours_xld (Edges, EdgesClosed, 'closed', 0, 2.0, 0, 0)
select_contours_xld (EdgesClosed, EdgesMarks, 'length', 20, 80, 0, 0)
fit_ellipse_contour_xld (EdgesMarks, 'fitzgibbon', -1, 2, 0, 200, 3, 2.0, \
Row, Column, Phi, Radius1, Radius2, StartPhi, \
EndPhi, PointOrder)
gen_ellipse_contour_xld (EllMarks, Row, Column, Phi, Radius1, Radius2, \
StartPhi, EndPhi, PointOrder, 1.5)
length_xld(EllMarks,Length)
halcon从自学到接项目视频教程,另外再赠送全网最全资源