300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 最小误差阈值分割 matlab 原创:最小包容区域法处理圆度误差的程序算法

最小误差阈值分割 matlab 原创:最小包容区域法处理圆度误差的程序算法

时间:2020-05-21 07:21:03

相关推荐

最小误差阈值分割 matlab 原创:最小包容区域法处理圆度误差的程序算法

希望可以加分,这能鼓励我们对生活工作中遇到的问题应用matlab来解决。

在工作中遇到这样的一个问题:当用三坐标测量圆特征,得到平面上离散分布的若干点,这些点近似分布在圆周上。如何评价该圆特征的圆度?

圆度误差的评定方法有4种:最小包容区域法,最小外接圆法,最大内切圆法,最小二乘法。最小包容区域法是符合圆度定义的方法,其他方法实际上是不符合圆度定义的,但由于最小包容区域法很难实现,故只好用其他方法来近似代替。

假设平面上有若干个测量点,大概在它们的中间随便找一点,以该点为中心创建一个矩形区域,该矩形区域内创建出均匀分布的很多点,充满矩形区域。然后计算这些构造的“中心点”到周围测量点之间的距离。对某一个构造的“中心点”来说,总可以找到距离它最远和最近的两个测量点,记下这它们的距离差,认为该距离差是圆度的一个备选值。对于矩形框内所有的中心点来说,必然有一个中心点(假设为o1)对应着最小的一个距离差。理论上,只要矩形框内构造的“中心点”足够密,则一定可以找到符合精度的圆度值。

但如果圆特征较大,按照上面所说,可能计算就要花费很多时间。于是对该方案进行了修改,先创建一个较疏的矩形点阵,找到o1后,再以o1为中心,创建另一个矩形框,该矩形框尺寸比第一个的减小一半,但里面点数目不变,这样点的密度就增加到原来的4倍。由于点数目没变,比较少,所以计算速度应该比较快。而且由于点的密度增加了,所找到的“中心点”也更精确。

根据需要设定循环次数。可以找到符合精度要求的中心点,以及它对应的圆度误差值。

以下是matlab程序:经过测试,所得到的圆度值随着循环次数n的增大而减小,而且下降速度越来越慢。可以认为,最终收敛于真正的圆度值。附件将圆度值与循环次数n的关系用图表显示出来,比较直观。

% 求圆特征的圆度及相应的中心点

xi=input('输入测量点的横坐标:');

yi=input('输入测量点的纵坐标:');%yi与xi长度相等

xmin=min(xi);

xmax=max(xi);

ymin=min(yi);

ymax=max(yi);

xoc=0.5;%可以修正

yoc=0.5;%可以修正

xco=xmin+xoc*(xmax-xmin);%设定的圆环中心点群的中心点的横坐标

yco=ymin+yoc*(ymax-ymin);%设定的圆环中心点群的中心点的纵坐标

x_range=(xmax-xmin)/2;

y_range=(ymax-ymin)/2;

incr_x=x_range/10;%x轴上有20个刻度

incr_y=y_range/10;%y轴上有20个刻度

xo=[xco-x_range:incr_x:xco+x_range];%设定的中心搜索点的横坐标组成的向量

yo=[yco-y_range:incr_y:yco+y_range];%设定的中心搜索点的纵坐标组成的向量

R=[];

for n=1:10%循环次数,可以修正

for j=1:length(xo)%某个搜索点在x轴上的索引号

for k=1:length(yo)%该搜索点在y轴上的索引号

for i=1:length(xi)%测量点索引号

R(j,k,i)=sqrt((xi(i)-xo(j)).^2+(yi(i)-yo(k)).^2);

end

rmax(j,k)=max(R(j,k,:));

rmin(j,k)=min(R(j,k,:));

delta_r(j,k)=rmax(j,k)-rmin(j,k);

end

end;

[delta_rmi,row]=min(delta_r);

[delta_rmin,column]=min(delta_rmi);

x_range=x_range*0.5;%搜索区域减小到原来的25%,可以修正

y_range=y_range*0.5;%搜索区域减小到原来的25%,可以修正

n=n+1;

incr_x=incr_x/2;%x方向密度增加到原来的2倍

incr_y=incr_y/2;%y方向密度增加到原来的2倍

xco=xo(row(column));

yco=yo(column);

xo=[xco-x_range:incr_x:xco+x_range];

yo=[yco-y_range:incr_y:yco+y_range];

end;

x=xco

y=yco

for i=1:length(xi)

r(i)=sqrt((xi(i)-x)^2+(yi(i)-y)^2);

end

r_o=max(r)

r_i=min(r)

delta_radi=r_o-r_i

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。