MATLAB 限定 x 范围进行平面拟合

本文将介绍如何在 MATLAB 中使用 SVD 方法进行平面拟合,并通过限定 x 范围来筛选数据,以获得更精准的拟合结果。

原始代码:

clc;
close all;

% 读取 CSV 文件
data = csvread('D:\桌面\点云\del-point.csv');

% 提取 x 和 y 坐标
x = data(:, 1);
y = data(:, 2);
z = data(:, 3);

% 绘制所有点
scatter3(x, y, z);
xlabel('X');
ylabel('Y');
zlabel('Z')
title('坐标点分布');
hold on;

 planeData=[x,y,z];
 
% 协方差矩阵的SVD变换中,最小奇异值对应的奇异向量就是平面的方向
xyz0=mean(planeData,1);
centeredPlane=bsxfun(@minus,planeData,xyz0);
[U,S,V]=svd(centeredPlane);
 
a=V(1,3);
b=V(2,3);
c=V(3,3);
d=-dot([a b c],xyz0);
 
% 图形绘制
xfit = min(x):0.1:max(x);
yfit = min(y):0.1:max(y);
[XFIT,YFIT]= meshgrid (xfit,yfit);
ZFIT = -(d + a * XFIT + b * YFIT)/c;
mesh(XFIT,YFIT,ZFIT);

限定 x 范围的代码:

clc;
close all;

% 读取 CSV 文件
data = csvread('D:\桌面\点云\del-point.csv');

% 提取 x 和 y 坐标
x = data(:, 1);
y = data(:, 2);
z = data(:, 3);

% 设置 x 范围
x_min = -10;
x_max = 10;

% 筛选符合 x 范围的点
idx = (x >= x_min) & (x <= x_max);
x_filtered = x(idx);
y_filtered = y(idx);
z_filtered = z(idx);

% 绘制筛选后的点
scatter3(x_filtered, y_filtered, z_filtered);
xlabel('X');
ylabel('Y');
zlabel('Z')
title('坐标点分布');
hold on;

% 构建平面拟合数据
planeData = [x_filtered, y_filtered, z_filtered];

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

a = V(1, 3);
b = V(2, 3);
c = V(3, 3);
d = -dot([a, b, c], xyz0);

% 图形绘制
xfit = x_min:0.1:x_max;
yfit = min(y_filtered):0.1:max(y_filtered);
[XFIT, YFIT] = meshgrid(xfit, yfit);
ZFIT = -(d + a * XFIT + b * YFIT) / c;
mesh(XFIT, YFIT, ZFIT);

解释:

  1. 筛选数据: 使用逻辑索引 idx 来标记符合 x 范围的点,并提取对应的 x、y 和 z 坐标。
  2. 平面拟合: 使用筛选后的数据进行平面拟合,得到平面方程和绘制结果。
  3. 调整范围: 根据实际情况调整 x_minx_max 的值来限定 x 的范围。
  4. 路径: 确保将 CSV 文件的路径正确指定。

通过限定 x 范围,我们可以排除一些无关的数据,从而获得更精准的平面拟合结果。

应用场景:

该方法适用于需要对特定区域进行平面拟合的场景,例如:

  • 对某个区域的点云数据进行平面拟合
  • 对某个区域的地形进行建模
  • 对某个区域的图像进行分析

注意:

  • 确保数据类型一致
  • 调整参数以获得最佳拟合结果
  • 可以根据需要添加其他参数限制

原文地址: https://www.cveoy.top/t/topic/bPyz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录