Matlab基于主成分分析(PCA)的平面拟合—点云处理及可视化第2期

目录

1 概述

2 代码实现

3 可视化验证

完整代码:


PCA平面拟合结果

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


1 概述

利用主成分分析(Principal Components Analysis, PCA)方法,可计算待拟合点的法向量,进而得到平面参数

原理详见参考文献

Pauly M, Keiser R, Gross M. Multi‐scale feature extraction on point‐sampled surfaces[C]//Computer graphics forum. Oxford, UK: Blackwell Publishing, Inc, 2003, 22(3): 281-289.

2 代码实现

function planes = fitPlane_PCA(data)% 功能:利用PCA拟合平面% 输入:data   - 原始数据(m*3)    % 输出:planes - 拟合所得平面参数 points = data(:,1:3);[m,~] = size(points);% 计算协方差矩阵M = points-ones(m,1)*(sum(points,1)/m);C = M.'*M./(m-1);  % 计算特征值与特征向量[V, D] = eig(C);% 最小特征值对应的特征向量为法向量s1 = D(1,1);s2 = D(2,2);s3 = D(3,3);if (s1 <= s2 && s1 <= s3)    normal(1,:) = V(:,1)/norm(V(:,1));elseif (s2 <= s1 && s2 <= s3)    normal(1,:) = V(:,2)/norm(V(:,2));elseif (s3 <= s1 && s3 <= s2)    normal(1,:) = V(:,3)/norm(V(:,3));end % 平面参数标准化dtmp = mean(points*normal');planes(1:3) = normal'*sign(dtmp);planes(4) = -dtmp*sign(dtmp);end

3 可视化验证

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

%% 数据准备% 读取数据data = load('data.txt');%% PCA平面拟合% 平面:Ax+By+Cz+D=0planes = fitPlane_PCA(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('基于PCA的平面拟合');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('test.png','-r300','-dpng')

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

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

最终结果如下:

以上。

完整代码:

Matlab基于PCA的平面拟合

### 使用MATLAB实现PCA点云拟合 在MATLAB中,可以使用主成分分析(Principal Component Analysis, PCA)来对点云数据进行拟合。以下是详细的说明以及示例代码。 #### 1. 数据准备 为了执行PCA点云拟合,首先需要加载或创建点云数据。如果使用的是实际点云文件,则可以通过`pcread`函数读取常见的点云格式文件,例如`.ply`或`.pcd`[^1]。 ```matlab % 加载点云数据 (假设为 PLY 文件) filename = 'stanford_bunny.ply'; ptCloud = pcread(filename); points = ptCloud.Location; % 获取点坐标 ``` #### 2. 执行PCA分析 MATLAB提供了内置的`pca`函数用于执行主成分分析。通过该函数可以获得点云的主要方向及其对应的特征向量和特征值[^2]。 ```matlab % 对点云数据执行PCA [coeff, score, latent] = pca(points); % coeff: 主成分的方向向量 % score: 原始数据投影到主成分上的得分 % latent: 特征值,表示各主轴的重要性 ``` #### 3. 提取直线参数 根据PCA的结果,最小特征值对应的方向是最不重要的方向,通常可以用作平面法线或者拟合直线的方向矢量。最大特征值对应的方向则是最重要的方向,即点云分布的主要趋势。 ```matlab % 最大特征值对应的第一主成分作为拟合直线方向 lineDirection = coeff(:,1); % 计算直线上的一点(可以选择质心) centroid = mean(points, 1); pointOnLine = centroid; ``` #### 4. 可视化结果 完成PCA分析后,可以可视化原始点云和拟合的直线以便验证结果。 ```matlab % 绘制点云 figure; scatter3(points(:,1), points(:,2), points(:,3), 10, 'filled'); hold on; % 绘制拟合直线 t = linspace(-100, 100, 100); % 参数范围 linePoints = bsxfun(@plus, pointOnLine, t' * lineDirection); % 直线方程 plot3(linePoints(:,1), linePoints(:,2), linePoints(:,3), 'r', 'LineWidth', 2); grid on; xlabel('X'); ylabel('Y'); zlabel('Z'); title('PCA Point Cloud Fitting Result'); legend('Point Cloud', 'Fitted Line'); ``` 以上代码展示了如何利用MATLAB自带的功能完成点云PCA拟合过程,并提供了一个简单的可视化方式展示结果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值