根据空间点坐标拟合平面和直线

[复制链接]
luke306 发表于 2013-2-20 02:11:31
根据一组点的坐标拟合空间平面,有两种方法
第一种:如果在测量得到的数据中,x,y值都是确认没有误差的,而误差只是出现在z值上,则可以使用线性回归的方法,此方法最小二乘的目标是在z方向上de残差
Matlab 代码
  1. % 随机生成一组(x,y,z),这些点的坐标离一个空间平面比较近
  2. x0=1,L1=2;
  3. y0=1,L2=2;
  4. x=x0+rand(20,1)*L1;
  5. y=y0+rand(20,1)*L2;
  6. z=1+2*x+3*y;
  7. scatter3(x,y,z,'filled')
  8. hold on;
  9. X = [ones(length(x),1) x y];

  10. % 拟合,其实是线性回归,但可以用来拟合平面
  11. % 输出为 b = [b(1) b(2) b(3)] 表示 z = b(1) + b(2)*x + b(3)*y 是拟合出来的平面的方程
  12. [b,bint,r,rint,stats] = regress(z,X,95);

  13. % 图形绘制
  14. xfit = min(x):0.1:max(x);
  15. yfit = min(y):0.1:max(y);
  16. [XFIT,YFIT]= meshgrid (xfit,yfit);
  17. ZFIT = b(1) + b(2) * XFIT + b(3) * YFIT;
  18. mesh(XFIT,YFIT,ZFIT);
复制代码
输出结果如图1

第二中: 如果在测量得到的数据中,x,y,z都存在误差,则最小化的目标应该是测量点到平面距离的残差
Matlab代码
  1. % 随机生成一组(x,y,z),这些点的坐标离一个空间平面比较近
  2. x0=1,L1=2;
  3. y0=1,L2=2;
  4. x=x0+rand(20,1)*L1;
  5. y=y0+rand(20,1)*L2;
  6. z=1+2*x+3*y;
  7. scatter3(x,y,z,'filled')
  8. hold on;

  9. planeData=[x,y,z];

  10. % 协方差矩阵的SVD变换中,最小奇异值对应的奇异向量就是平面的方向
  11. xyz0=mean(planeData,1);
  12. centeredPlane=bsxfun(@minus,planeData,xyz0);
  13. [U,S,V]=svd(centeredPlane);

  14. a=V(1,3);
  15. b=V(2,3);
  16. c=V(3,3);
  17. d=-dot([a b c],xyz0);

  18. % 图形绘制
  19. xfit = min(x):0.1:max(x);
  20. yfit = min(y):0.1:max(y);
  21. [XFIT,YFIT]= meshgrid (xfit,yfit);
  22. ZFIT = -(d + a * XFIT + b * YFIT)/c;
  23. mesh(XFIT,YFIT,ZFIT);
复制代码
输出结果如图2

而根据空间点拟合一条空间直线的思路比较直接,就是最小化这些点到直线的距离
  1. % 随机生成一组点,这写点距离直线l比较近,l的过点[1,1,1],方向向量为[1,2,3]
  2. lineData=bsxfun(@plus, [1,1,1], (-1:.1:1).'*[1,2,3]);
  3. Noise=rand(size(lineData))*.1;
  4. lineData=lineData+Noise;
  5. scatter3(lineData(:,1), lineData(:,2), lineData(:,3),'filled')
  6. hold on;

  7. % 拟合的直线必过所有坐标的算数平均值
  8. xyz0=mean(lineData,1),

  9. % 协方差矩阵奇异变换,与拟合平面不同的是
  10. % 所得直线的方向实际上与最大奇异值对应的奇异向量相同
  11. centeredLine=bsxfun(@minus,lineData,xyz0);
  12. [U,S,V]=svd(centeredLine);
  13. direction=V(:,1);

  14. % 画图
  15. t=-8:0.1:8;
  16. xx=xyz0(1)+direction(1)*t;
  17. yy=xyz0(2)+direction(2)*t;
  18. zz=xyz0(3)+direction(3)*t;
  19. plot3(xx,yy,zz)
复制代码
输出结果如图3


图1:线性回归拟合平面

图1:线性回归拟合平面

图2:最小距离平方拟合平面

图2:最小距离平方拟合平面

图3: 最小距离平方拟合空间直线

图3: 最小距离平方拟合空间直线

21 条回复


zz0147 发表于 2013-3-21 20:51:16
,学习了
如果有空间圆的就更好了。

adong7639 发表于 2015-5-14 17:24:53
提示: 作者被禁止或删除 内容自动屏蔽

fcn226 发表于 2015-8-18 19:48:56
初学者 不太懂
第二个程序中 d是测量点到平面距离的残差吗
如果不是 哪个参数表示的是所有测量点到平面距离的残差呢
还有第二个程序里对应的平面表达式应该是什么呢。。。
麻烦知道的大神给解答一下号码

zhwfq 发表于 2015-10-13 16:43:50
好帖好帖,直接就能用

wss3344wss 发表于 2015-11-8 19:40:56
找了很久,就这个说的比较全面,感谢啊

wx_UUjJ92Jl 发表于 2015-12-7 18:48:24
楼主在么?我想知道前俩种拟合平面的时候区别大吗?

wx_UUjJ92Jl 发表于 2015-12-7 19:34:34
26.ZFIT = -(d + a * XFIT + b * YFIT)/c;这一行表示平面方程对不对呀?

七分裤qp 发表于 2015-12-24 16:13:27
楼主知道怎么把三维曲线拟合成二维曲线吗?实际运动路径是个x,y平面的圆形,但定位传感器输出的是x,y面上近似为椭圆的图形,而z坐标上下波动的三维图形。  求怎么把着三维图形拟合成二维的图形

rambus 发表于 2016-6-2 17:37:08
您好!我想请教一下,如果想确定出拟合平面的面积应该怎样处理呢?

suger_j 发表于 2016-6-4 15:21:06
楼主技能贴 帮到我了

rambus 发表于 2016-6-5 20:59:20
学习了!非常感谢!

lszoptics 发表于 2016-7-22 16:25:17
非常感谢,感觉这个和主成份分析很像啊,很有用!谢谢楼主

tingge 发表于 2016-9-26 21:45:59
写得好   直接能用

冰激凌的涙 发表于 2017-3-20 15:04:25
在二维空间里有一些坐标点,想画出最接近这些点的一条直线,程序该怎么写?

初阳数雨 发表于 2017-4-10 21:34:58
同问15楼

慕容玖玖 发表于 2017-4-19 14:34:51
如果已知多个点的空间三维坐标,拟合的平面是一个平行于xoy平面(也就是说z是一个常数,也就是平面的方向向量已知)这个程序应该怎么改呢?

求大神指点啊

慕容玖玖 发表于 2017-4-19 14:37:45
如果已知多个点的空间三维坐标,拟合的平面是一个平行于xoy平面(也就是说z是一个常数,也就是平面的方向向量已知)这个程序应该怎么改呢?

求大神指点啊

woailiangyuqian 发表于 2017-9-23 17:25:31
已经有数据怎么用啊

小顽子8231 发表于 2017-9-23 18:53:00
好,顶一个

纠结中 发表于 2018-8-16 09:41:56
zz0147 发表于 2013-3-21 20:51
,学习了
如果有空间圆的就更好了。

楼主有空间圆??

1400457240 发表于 2019-7-29 09:45:02
大神,学习了。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表