快速平面拟合到许多点



我希望将平面拟合到一组~6-10k 3D点上。我希望尽快做到这一点,准确性不是最关心的问题(坦率地说,飞机在任何基轴上都可以偏离+-10度)。

我目前的方法是使用最佳拟合,但它非常慢(我希望每次运行算法时以大约 10-50k 次的速度提取平面,按照这个速度它将在几周内完成,而不是几个小时),因为它适用于所有可能的 6000 点组合,所以 ~35,000,000,000 次迭代, 坦率地说,它的准确性比我需要的要高得多。

有没有人知道任何较弱的平面拟合技术可能会大大加快我的算法速度?

编辑:

我设法将迭代次数减少到 ~42k,方法是在每个可能的 3D 角度创建平面(每次以 5 度步进)并针对这些点测试现有点以找到最佳平面,而不是将平面拟合到我拥有的点。

我相信分而治之在这里也能得到一些收获,尽管我担心我可以直接跳过最好的飞机。

使用标准平面方程Ax + By + Cz + D = 0,并将方程写为矩阵乘法。 P是你未知的4x1 [A;B;C;D]

g = [x y z 1];  % represent a point as an augmented row vector
g*P = 0;        % this point is on the plane

现在将其扩展到所有实际点,一个 Nx4 矩阵G . 结果不再完全是 0,而是您试图最小化的错误。

G*P = E;   % E is a Nx1 vector

所以你想要的是最接近 G 零空间的向量,可以从 SVD 中找到。 让我们测试一下:

% Generate some test data
A = 2;
B = 3;
C = 2.5;
D = -1;
G = 10*rand(100, 2);  % x and y test points
% compute z from plane, add noise (zero-mean!)
G(:,3) = -(A*G(:,1) + B*G(:,2) + D) / C + 0.1*randn(100,1);
G(:,4) = ones(100,1);   % augment your matrix
[u s v] = svd(G, 0);
P = v(:,4);             % Last column is your plane equation

好的,请记住,P 可以随标量变化。 所以只是为了表明我们匹配:

scalar = 2*P./P(1);
P./scalar

答 = 2.0000 3.0038 2.5037 -0.9997

在计算机视觉中,标准方法是使用 RANSAC 或 MSAC,在您的情况下;

  1. 从总体中随机取 3 个点
  2. 计算由 3 个点定义的平面
  3. 对到该平面的所有点的误差(到平面的距离)求和。
  4. 保留显示最小误差总和(并在阈值范围内)的 3 个点。
  5. 重复 N 次迭代(参见 RANSAC 理论选择 N,我可以建议 50 次吗?

http://en.wikipedia.org/wiki/RANSAC

看起来griddata可能是你想要的。该链接中有一个示例。

如果这不起作用,可以在 MATLAB File Exchange 上查看gridfit。它是为了匹配比griddata更普遍的情况

您可能不想滚动自己的表面拟合,因为那里有几种有据可查的工具。

griddata为例:

x = % some values 
y = % some values
z = % function values to fit to
ti = % this range should probably be greater than or equal to your x,y test values
[xq,yq] = meshgrid(ti,ti);
zq = griddata(x,y,z,xq,yq,'linear'); % NOTE: linear will fit to a plane!
Plot the gridded data along with the scattered data.
mesh(xq,yq,zq), hold
plot3(x,y,z,'o'), hold off

您可以尝试John D'Errico的合并器。它将点聚合在给定的公差范围内,这将允许减少数据量并提高速度。您还可以检查 John 的网格拟合函数,该功能通常比 griddata 更快、更灵活

最新更新