给定多个点,根据最小二乘原理,可以拟合出一个圆形,拟合的精度很高,空间中的离散点得到拟合平面,其实这就是一个最优化的过程。即求这些点到某个平面距离和最小的问题。我们知道一个先验消息,那就是该平面一定会过众散点的平均值。接着我们需要做的工作就是求这个平面的法向量。
有一个思路供参考
设样本点(Xi, Yi)位于自变量为(x, y)的圆上, 圆方程为:
(x-x0)^2 + (y-y0)^2 = r^2
换一种思路, 上述方程可以看成关于(x0, y0, r)的方程, 以(x,y)为参量, 对应一个3维曲面
这样, 任意一个样本点都对应一个3维曲面
首先, 粗略限定(x0, y0, r)的范围
然后, 确定步长 将x0, y0离散化 这样, 一个(Xi, Yi), 能得到3个矩阵(分别与x0, y0, r对应)
然后, 对于全部的3维曲面, 搜索密度最大的区域
对于区域内部的点, 分别对x0, y0, r计算平均值 就是待求的圆心坐标(x0, y0)和半径r
一种是利用图像工具栏的放大功能,用肉眼读出。
具体做法为:不断放大目标点,直到坐标精度达到使用者的要求
第二种是利用ginput函数,从图中点击不同位置获取不同点的坐标值,但是这个坐标值是相对坐标,不是绝对坐标
a = ginput(1);disp(a);此时使用者只需在图中点击目标点,即可显示出目标点坐标。
最后一种是利用工具栏中的tip工具,插入数据点标注,这个功能不仅能精确得到点坐标,而且可以标识出来。
工具栏->insert->tip工具。点击待读入点即可,程序会自动定位至曲线上
如果想要一个完整的圆形:“圆”命令“三点(3P)”法,任意选取其中的三个点,作出一个圆。然后调整圆心位置、圆半径大小,使尽可能多的点落在圆周上(或更接近圆周)。这是很考验你的设计能力的。
如果不考虑圆形是否完整,试一试命令“样条曲线(SPLINE)”,看看结果是否是你想要的。
设该圆心坐标为r(x,y,z),半径为R,则拟合最优函数及其导数满足:
所要做的就是求解偏导数为0的4个非线性方程,可以用matlab的fsolve求解
用最小二乘法可以得出,圆心横坐标就是图上点的横坐标的平均值,圆心纵坐标就是图上的点的
坐标的平均值;(只找了左边的圆 右边的一样,坐标都是像素坐标)
clc,clear;
data=imread('roundPNG');
data1=double(data(:,1:250));
data2=double(data(:,251:506));
% figure(1)
% imshow(data1);
% figure(2)
% imshow(data2);
%对于第一个圆
% figure(3)
% mesh(data1)
[x,y]=find(data1>20);%第二个圆只需把data1换成data2
plot(x,y,'');
x0=mean(x);%圆心横坐标
y0=mean(y);%圆心纵坐标
hold on
plot(x0,y0,'');
r=mean(sqrt((x-x0)^2+(y-y0)^2))
hold on
xx=x0-r:x0+r;
y1=sqrt(r^2-(xx-x0)^2)+y0;
y2=-sqrt(r^2-(xx-x0)^2)+y0;
plot(xx,y1,'r')
plot(xx,y2,'r')
给你一个例子,供你参考。
clc,clear
A=[384 310;386 306;389 300;392 294;396 287;400 281;404 277;409
272;413 269;417 267;420 265;424 263;430 260;434 257;439 256];
X=A;
n=length(X(:,1));
y=ones(n,1);
b=[rand(1)1000 rand(1) rand(1)]
fun=inline('X(:,1)^2+X(:,2)^2+a(1)X(:,1)+a(2)X(:,2)+a(3)','a','X');
[a,r,J] = nlinfit(X,y,fun,b)
vpa(a,10)
%圆心
X1 =-a(1)/2,Y1 =-a(2)/2
%半径
R =sqrt(a(1)^2+a(2)^2-4a(3))/2
这例题是我前不久完成的。
以上就是关于polywords上测出了四个圆,怎么用四个圆心拟合成一个平面全部的内容,包括:polywords上测出了四个圆,怎么用四个圆心拟合成一个平面、各位,有没有拟合圆的较好的方法和代码,先、如何拟合计算出图像中光斑的圆心位置 matlab等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)