Matlab最小二乘平面拟合(SVD方法)—点云处理及可视化第3期
创始人
2024-03-04 05:30:37
0

在之前的文章中,分享了Matlab基于PCA的平面拟合方法

这一次,再来分享一下基于奇异值分解(Singular Value Decomposition, SVD)的平面拟合

先来看一下成品效果:

特别提示:《Matlab点云处理及可视化》系列文章整理自作者博士期间的部分成果,旨在为初入点云处理领域的朋友提供一份较为权威、可直接用于论文写作的Matlab点云数据处理教程。如果觉得有用可以分享给更多的人。


1 概述

奇异值分解是线性代数中一种重要的矩阵分解,是特征分解在任意矩阵上的推广。

基于奇异值分解的平面拟合方法通过对去质心后的待拟合点坐标矩阵进行奇异值分解,将最小奇异值对应的特征向量作为拟合平面法向量,进而得到平面参数

2 代码实现

function planes = fitPlane_SVD(data)% 功能:利用SVD拟合平面% 输入:data   - 原始数据(m*3)    % 输出:planes - 拟合所得平面参数 points = data(:,1:3);% 去质心M = points - repmat(mean(points),size(points,1),1);% 奇异值分解[~,~,V] = svd(M,0);% 最小特征值对应的特征向量为法向量normal = V(:,3)';% 平面参数标准化dtmp = mean(points*normal');planes(1:3) = normal'*sign(dtmp);planes(4) = -dtmp*sign(dtmp);end

3 可视化验证

为了检测平面拟合的效果,采用仿真数据进行验证:

%% 数据准备% 读取数据data = load('data.txt');%% SVD平面拟合% 平面:Ax+By+Cz+D=0planes = fitPlane_SVD(data);A = planes(1);B = planes(2);C = planes(3);D = planes(4);%% 可视化验证% 窗口尺寸设置(单位:厘米)figureUnits = 'centimeters';figureWidth = 15;figureHeight = 15;figureHandle = figure;set(gcf, 'Units', figureUnits, 'Position', [0 0 figureWidth figureHeight]);% 原始点云可视化l = scatter3(data(:,1),data(:,2),data(:,3),15);% 原始点云hold on% 拟合平面绘制xfit = min(data(:,1)):0.01:max(data(:,1));yfit = min(data(:,2)):0.01:max(data(:,2));[XFit,YFit]= meshgrid (xfit,yfit);ZFit = -(D + A * XFit + B * YFit)/C;s = surf(XFit,YFit,ZFit,'EdgeColor','none');hTitle = title('基于SVD的平面拟合');hXLabel = xlabel('XAxis');hYLabel = ylabel('YAxis');hZLabel = zlabel('ZAxis');% 细节优化colormap(map)set(l,'Marker','o','MarkerFaceColor',CR,'MarkerEdgeColor',CR)view(-27.5,46.9);% 视角set(gca, 'Box', 'on', ...                                    % 边框         'XGrid','on','YGrid','on','ZGrid','on', ...         % 网格         'TickDir', 'out', 'TickLength', [0.01 0.01], ...    % 刻度         'XMinorTick', 'off', 'YMinorTick', 'off', ...       % 小刻度         'XColor', [.1 .1 .1],  'YColor', [.1 .1 .1],...     % 坐标轴颜色         'XLim',[-1.4 0.2])        % 字体和字号set(gca, 'FontName', 'Arial', 'FontSize', 10)set([hXLabel, hYLabel, hZLabel], 'FontName', 'Arial','FontSize', 11)set(hTitle, 'FontName', '微软雅黑', 'FontSize', 12, 'FontWeight' , 'bold')% 背景颜色set(gcf,'Color',[1 1 1])% 图片输出print('test0.png','-r300','-dpng')

其中,为了区分不同对象,从Matlab配色神器TheColor的XKCD和SCI颜色库中选择对比色及渐变色

% 颜色定义CR = TheColor('xkcd',536);map = TheColor('sci',2040);

最终结果如下:

以上。

获取方式:

Matlab基于SCD的平面拟合

相关内容

热门资讯

美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...