*step 1  --通过边缘提取或者切片,或者区域转轮廓线, 得到一系列的轮廓线

*来的整体,

dev_set_colored(12)

*step 2.  分割 类似于  blob分析, ---connection---把一个整体,分裂

Contours 轮廓;外形;曲线;弯曲的表面

Xld* Edges  亚像素 xld轮廓线

segment_contours_xld (Edges, ContoursSplit, 'lines', 5, 1, 0.5)

*step3 根据角度和长度来进行筛选

*区域  --面积 或者长度 row

* select_shape_xld (SelectedXLD1, SelectedXLD, ['contlength','phi'], 'and', [0,-0.5907], [200,0])

dev_set_color('red')

*避开一些零碎的干扰项

select_shape_xld (ContoursSplit, SelectedXLD1, 'contlength', 'and', 16.91, 200)

*step4--整理与优化

联合 , 把角度相近 ,距离相近的直线段 , 合并一起

*共线-共直线, 角度,方向相近的线段 合并

*region  union1合并区域, 筛选 , 和特征筛选一样

union_collinear_contours_xld ( SelectedXLD1, UnionContours1,100, 20, 2, 0.1, 'attr_keep')

select_shape_xld (UnionContours1, UnionContours, 'contlength', 'and', 76.91, 200)

*共圆弧, 半径一直的圆弧 , 合并

* union_cocircular_contours_xld (SelectedXLD1, UnionContours, 0.5, 0.1, 0.2, 30, 10, 10, 'true', 1)

count_obj (UnionContours, NumberLine)

*step5---找到目标线段, 拟合直线, 垂直线与水平线相交,得到交点

gen_empty_obj (Lines)

* 第1 部分 选择垂直线

*找直线  *'direction'  根据角度进行筛选

select_contours_xld (UnionContours, LinesVerticalS, 'direction', rad(70), rad(110), 0, 0)

*拟合成线段

fit_line_contour_xld (LinesVerticalS, 'tukey', -1, 0, 5, 2, RowBegin1, ColBegin1, RowEnd1, ColEnd1,Nr, Nc, Dist)

*绘制直线

gen_contour_polygon_xld (Contour1, [RowBegin1,RowEnd1], [ColBegin1,ColEnd1])

* 第2 部分 选择水平线

select_contours_xld (UnionContours, LinesHorizontalS, 'direction', rad(-30), rad(30), 0, 0)

fit_line_contour_xld (LinesHorizontalS, 'tukey', -1, 0, 5, 2, RowBegin2, ColBegin2, RowEnd2, ColEnd2, Nr, Nc, Dist)

gen_contour_polygon_xld (Contour2, [RowBegin2,RowEnd2], [ColBegin2,ColEnd2])

*两条线 求交点

intersection_lines (RowBegin1, ColBegin1, RowEnd1, ColEnd1, RowBegin2, ColBegin2, \

                    RowEnd2, ColEnd2, Row, Column, IsOverlapping1)

* gen_cross_contour_xld (Cross, Row, Column, 30, 0.785398)

算子1

edges_sub_pix (ImageReduced1, Edges, 'canny',2,20,40)

Canny边缘检测算法

step1: 用高斯滤波器平滑图象;

step2: 用一阶偏导的有限差分来计算梯度的幅值和方向;

step3: 对梯度幅值进行非极大值抑制

step4: 用双阈值算法检测和连接边缘

算子2

segment_contours_xld (Edges, ContoursSplit, 'lines', 5,1, 0.5)

1)、segment_contours_xld

                    

参数说明:

Contours 需要进行分割的轮廓。

ContoursSplit 分割后的轮廓tuple。

Mode 分割轮廓的方式,可以选择'lines'(使用直线段分割), 'lines_circles'(使用直线段和圆(弧)分割), 'lines_ellipses'(使用直线段和椭圆弧分割)。

SmoothCont 轮廓平滑的参数,可以抑制在折线逼近过程中过短的线段,能更加鲁棒的逼近圆和椭圆。

首先通过折线来逼近输入的轮廓,这样,在弯曲的地方轮廓就会被过度的分割,如果用圆弧可以更好地逼近轮廓,则用圆弧或椭圆弧分别代替相邻的线段。如果SmoothCont设置为> 0,则首先对输入的轮廓进行平滑,这是必要的,因为平滑抑制了轮廓上的异常值,所以一方面可以防止在分割特别短的线的时后带来的异常,另一方面,在使用圆或椭圆分割时,可以实现更稳健的分割;

(1)、不能等于0;

(2)、最好大于等于3并且是奇数;

(3)、建议值是5;

MaxLineDist1 (

1)、需要大于等于0.0;

第一次用Ramer算法(即用直线段递进逼近轮廓)时的MaxLineDist,在逼近完成之后,再用圆弧或椭圆弧对相邻分割线段进行拟合,如果拟合圆弧到轮廓的距离小于逼近线段到轮廓的距离,就用圆弧替代逼近线段,这个过程一致迭代直到所有的线段拟合完毕。

MaxLineDist2 第二次逼近轮廓时的MaxLineDist,只有当MaxLineDist2

这种两步逼近算法效率较高,因为在第一次逼近过程中,递进逼近的直线段较少,因此较大直径的圆弧能够被高效的分割出来。在第二次逼近过程中,能够被小直径圆弧逼近的轮廓被找到,同时大直径圆弧的末端被重新定义。

在此之后,仍然由线段逼近的轮廓部分再次用最大距离MaxLineDist2的多边形逼近进行分割,并且新创建的线段在可能的情况下合并为圆形或椭圆弧。显然,这只会在MaxLineDist2 < MaxLineDist1时更改输出,这种两步方法比使用MaxLineDist2的一步方法更有效,由于在第一步中生成的线段较少,因此必须较少地进行圆或椭圆拟合。因此,使用长圆弧逼近部分输入轮廓会更高效;之后,再用短圆弧去逼近输入的轮廓,最后再细化使用过长圆弧逼近的轮廓的末端;

所述所得轮廓长度至少为3像素,并且包含所述输入轮廓的至少6个连续点;所有输入的长度小于3像素或少于6个轮廓点的轮廓线将被复制到输出轮廓线,不做任何修改。

Remark:

分割得到的轮廓是直线段、圆(圆弧)或者椭圆弧可以通过分割后轮廓的全局属性'cont_approx’参数的值来确定(参考get_contour_global_attrib_xld)。

如果'cont_approx'=-1,这一部分轮廓最适合被拟合为直线段。

如果'cont_approx'=0,这一部分轮廓最适合被拟合为椭圆弧。

如果'cont_approx'=1,这一部分轮廓最适合被拟合为圆弧。

算子3

union_collinear_contours_xld ( SelectedXLD1, UnionContours1,100, 20, 2, 0.1, 'attr_keep')

  1. ---相间隔的距离

算子4

select_shape_xld (ContoursSplit, SelectedXLD1, 'contlength', 'and', 16.91, 200)

算子5

select_contours_xld (UnionContours, LinesVerticalS, 'direction', rad(70), rad(110), 0, 0)

算子6

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

算子7

fit_circle_contour_xld (Circles, 'atukey', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)

* Algebraic distance measure代数距离测度

fit_circle_contour_xld (Contour, 'atukey', -1, 2, 0, 10, 1, Row, Column, Radius, StartPhi, EndPhi, PointOrder)

dev_set_color ('magenta')

gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 4 * acos(0), 'positive', 1)

* Geometric distance measure几何距离测度

fit_circle_contour_xld (Contour, 'geotukey', -1, 2, 0, 10, 1, Row, Column, Radius, StartPhi, EndPhi, PointOrder)

函数原型:

 椭圆拟合的难点

通常我们使用最小二乘法求解如下的最优化问题:

Min∑Ni=1f(xi,E) Min \sum_{i=1}^N f(x_i,E)

Min

i=1

N

​ 

 f(x

i

​ 

 ,E)

这里f(xi,E) f(x_i,E)f(x

i

​ 

 ,E)表示点xi x_ix

i

​ 

 到E(指待拟合的椭圆)的最小距离。一般称为几何距离。但是我们很难直接给定几何距离的解析表达,因此很难求出。因此我们退而求其次,我们采用:为椭圆写下隐式方程,然后将点的坐标带入此隐式方程就得到了点到椭圆的距离。这种方法对于直线拟合、圆拟合,返回的就是到其的真实距离。而对于椭圆拟合,它返回的值是与距离有类似的属性,但不是一个真正的距离值。因此这个距离被称为代数距离。

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

 

函数作用:

对一些线段的XLD做近似计算直线计算

参数Algorithm的可选项解释如下:

algebraic:这种方法最小化了轮廓点与结果圆之间的代数距离

ahuber:类似于algebraic,轮廓点被加权以减小异常值的影响基于方法Huber

atukey:类似于algebraic,轮廓点被加权以减小异常值的影响基于方法Tukey

https://www.jianshu.com/p/b1d5988f1042

geometric:该法最小化了轮廓点与结果圆之间的几何距离,该法被统计是最优的,但占用很多计算时间。如果轮廓点被噪声干扰严重,可以考虑使用该方法。

geohuber:类似于geometric,轮廓点被加权以减小异常值的影响基于方法Huber

geotukey:类似于geometric,轮廓点被加权以减小异常值的影响基于方法Tukey

 

ClippingFactor控制被弱化的异常值个数,值越小,越多异常值被检测到。

最小拟合一条线的必要轮廓点个数是2,因此,一条轮廓线点个数至少是2+2*ClippingEndPoints

 

参数列表:

Contours(in):输入轮廓

Algorithm(in):拟合圆的算法

MaxNumPoints(in):用于计算的最大轮廓点个数

MaxClosureDist(in):一个轮廓的末尾点最大间距被认为是闭合

ClippingEndPoints(in):在逼近过程中被忽略的开始及末尾点个数

Iterations(in):迭代的最大次数用于鲁棒加权拟合

ClippingFactor(in):消除异常值的裁剪因子

Row(out):圆心行坐标

Col(out):圆心列坐标

Radius(out):圆半径

StartPhi(out):开始点的角度(rad)

EndPhi(out):末尾点的角度(rad)

PointOrder(out):边界点的顺序

 

可能前置项:

gen_contours_skeleton_xld, lines_gauss, lines_facet, edges_sub_pix, smooth_contours_xld

 

可能后置项:

gen_ellipse_contour_xld, disp_circle, get_points_ellipse

 

可替代项:

fit_ellipse_contour_xld, fit_line_contour_xld

 对于“ * huber”和“ * tukey” ,使用鲁棒误差统计来估计没有离群点的近似圆到等高点的距离标准差。 Clippingfactor 参数(标准差的比例因子)控制着离群值的数量: 选择的值越小,检测到的离群值就越多。 在 tukey 算法中,异常值被去除,而在 huber 算法中,异常值只是阻尼,或者更准确地说,它们是线性加权的。 没有任何鲁棒加权的距离平方作为误差值的优化,即最小二乘公式。 在实际应用中,推荐使用 tukey 方法。参数迭代指定代数、 ahuber 和 atukey 算法的迭代次数。 “几何”、“ geohuber”和“ geotukey”算法忽略这个参数。 如果迭代次数设置为零,则算法不对拟合圆进行迭代改进,而只检查初始猜测是否已经足够接近,这取决于所选择的 outliers 处理方法。为了减少计算负荷,圆的拟合可以局限于轮廓点的子集: 如果将一个非 -1的值分配给最大值点,则只使用最大值点——均匀分布在轮廓上。 与 x 轴有关的同位角在 startphi 和 endphi 中返回,也可以参见椭圆轮廓 xld。 等高线,其起点和终点之间的距离小于或等于 maxclosuredist 被认为是封闭的。 因此,它们是近似于圆形,而不是圆弧。 由于人工制品在预处理的起点和终点的等高线可能是错误的。 因此,可以从圆的拟合中排除等高线起点和终点的剪切终点。 然而,它们仍然被用于确定开始值和内收值。拟合圆形所需等高点的最小数目是3。 因此,要求等高点的数目至少是。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐