说明 寻找从大型数据集创建平面的方法 数据集是扫描表面不完全平坦的测量数据,并且不会平坦到任何平面,因此难以进行统计分析。
目标是找到最能代表大部分点的平面,然后将其与XY平面对齐,以便从中提取信息。
附加的图像是数据图。颜色表示高度。注意:忽略小蓝点,这是我不用担心的其他数据。
数据的结构如何:
数据以N X 3数组形式出现
平面几乎是平坦的,但我需要将“平均平面”与XY平面精确对齐,以便考虑其他数据,这些数据可能与此示例不同。
在找到“平均平面”后,我会通过找到平面与XY,XZ和YZ轴的角度来进行矩阵变换以使其与轴对齐
我不寻找的东西,我也在搜索中找到:从3点找到一架飞机,或者使用冲浪或者delauny从数据中找到“滚动”表面图。
答案 0 :(得分:1)
您是否尝试过fit
?
ft = fit([X, Y], Z,'poly11');
UnnormPlaneNorm = [ft.p10; ft.p01; -1];
planeNorm = UnnormPlaneNorm / norm(UnnormPlaneNorm);
angleXY = acos([0,0,1] * planeNorm);
angleXZ = acos([0,1,0] * planeNorm);
angleYZ = acos([1,0,0] * planeNorm);
答案 1 :(得分:0)
4个步骤:
%1。计算数据的中心
%2。从数据中减去中心
%3。将2D平面安装到居中数据
%4。将计算中心添加回
首先,我将生成一组位于平面中的随机数据:
clear;close all;clc;
% Create a random set of data
mag = 20;
N = 1000;
A = 2 * mag * ( rand( N, 3 ) - 0.5 );
% We want to make sure that the data lies in a plane, so let's reduce it
% with the svd
[ U, S, V ] = svd(A,'econ');
S(3,3) = 0;
A = U * S * V.';
% Now we are going to offset the plane from the origin by a random point
p = 100 * rand(1,3);
A = A + repmat( p, N, 1 );
% Make sure we have the dataset we want by viewing from different angles
figure
subplot(1,3,1)
plot3(A(:,1),A(:,2),A(:,3),'.')
hold on
grid minor
view([1,1,1])
subplot(1,3,2)
plot3(A(:,1),A(:,2),A(:,3),'.')
hold on
grid minor
view([1,-1,1])
subplot(1,3,3)
plot3(A(:,1),A(:,2),A(:,3),'.')
hold on
grid minor
view([-1,1,1])
现在,在这一点上,A中的数据完全位于一个平面中。但我们想要噪声数据以确保算法正常工作。所以让我们重新加入噪音:
% Now let's add some noise to our data
B = A + randn(size(A));
现在我们开始在飞机上安装数据......
% 1. Compute the center of the data
c = mean(B);
% 2. Subtract off the mean from the data
D = B - repmat( c, N, 1 );
% 3. Fit a 2D plane to the centered data
[ U, S, V ] = svd( D, 'econ' );
S(3,3) = 0;
D = U * S * V.';
% 4. Offset by the computed center
D = D + repmat( c, N, 1 );
% 5. Visualize by comparing with the noisy data
figure
subplot(1,3,1)
plot3(B(:,1),B(:,2),B(:,3),'.')
hold on
plot3(D(:,1),D(:,2),D(:,3),'.')
grid minor
view([1,1,1])
subplot(1,3,2)
plot3(B(:,1),B(:,2),B(:,3),'.')
hold on
plot3(D(:,1),D(:,2),D(:,3),'.')
grid minor
view([1,-1,1])
subplot(1,3,3)
plot3(B(:,1),B(:,2),B(:,3),'.')
hold on
plot3(D(:,1),D(:,2),D(:,3),'.')
grid minor
view([-1,1,1])