按照字面意思,这样修改
for i=1:k
theta(i)=360/k*(i-1)
% 计算各测点相对于坐标圆点的坐标值
x=(P(i)+R).*cos(pi*theta./180)
y=(P(i)+R).*sin(pi*theta./180)
% 计算各测点相对于坐标原点的半径值
t(i)=x(i)
q(i)=y(i)
Ri(i)=sqrt(x(i)^2+y(i)^2)
% 积分计算最小二乘圆圆心坐标
% 将θ由角度值转变为弧度值
theta_r=pi*theta./180
x_sum=x_sum+x(i)
y_sum=y_sum+y(i)
end
% 计算各测量点相对于最小二乘圆圆心的最大半径和最小半径
for i=1:k
R_mea(i)=sqrt((t(i)-a)^2+(q(i)-b)^2)
end
我计算的结果是3.9421,比较接近文献的值:lol
既然你图不贴出来,所以也只能讲讲方法论:1、将这张轮廓图读入到一个矩阵中;
2、检测圆心位置;
3、分别计算圆心到不同圆弧的距离;
4、两者相减。
备注:只接受追问,不接受QQ聊天的问题(百度知道是一个讨论交流平台,为一个人服务就没意思了)。
给你提供个思路吧。首先我假设你提取出的圆轮廓还算比较规整,圆度不至于偏差太大。
你只需要求出最大内切圆和最小外接圆即可。算法比较容易设计,简单来看可以分为三部分:
1)确定圆心。首先,你先填充原来的轮廓图,获得一个实心的圆。然后,统计这个圆的质心。
程序写起来很容易,就是x放心和y放心各自按照坐标加权平均而已。
2)求最大内切圆。在上一步获得的圆心基础上,计算出最大的半径值,使得以此半径构成的圆被最大地包含在原始的轮廓圆内部。这种包含关系直接使用俩图做差看剩余像素点是否在内切圆内即可。
3)最小外接圆。基本思路同2)。只不过这里要找一个最小的半径值,使得以此半径构成的圆最小地包含原始的轮廓圆。包含关系与2)类似,不再啰嗦。
2)、3)完成之后,问题就解决了。用matlab写成代码应该比较容易,你自己应该能做。
当然,以上的算法求出的圆心可能需要微调一下,即你在进行2)和3)时,需要在算出的圆心附近做一下简单的搜索,以获得一个最优的未知,这个是小trick,注意下即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)