散点云处理笔记(一):基于主成份分析算法(PCA)的平面拟合
通过PCA(主成分分析)进行平面拟合是一种经典高效的方法,特别适用于三维点云数据。其核心思想是找到点云中方差最小的方向,该方向即为拟合平面的法线方向,该方向即为拟合平面的法线方向,而平面经过点云的质心。下面介绍原理、步骤,首先对其数学原理进行逐步推导。
1.数学原理推导
下面给出通过PCA进行平面拟合的详细数学推导。我们首先从问题描述开始,逐步推导最优平面由点云质心和协方差矩阵对应的特征向量确定。
1.1问题定义
给定一组由\(n\)个三维散点集合\(\{\mathbf{p}i\in\mathcal{R}^3\}{i=1}^n\) , 我们希望找到一个平面,使得所有点到该平面的垂直距离的平方和最小。该平面可用点法式表示为
\[\boldsymbol{\Pi}:\mathbf{n}^T(\mathbf{x}-\mathbf{c})=0,\tag{1} \]
其中\(\mathbf{n}\in\mathcal{R}^3\) 是拟合目标平面的单位法向量(\(\mathbf{n}=1\)),其中\(\mathbf{c}\in{\mathcal{R}^3}\) 是拟合目标平面任意一点。目标函数为:
\[E(\mathbf{n},\mathbf{c})=\sum_{i=1}^{n}(\mathbf{n}^T(\mathbf{x}-\mathbf{c}))^2 \tag{2} \]
约束条件为\(||\mathbf{n}||=1\)。这里\(\mathbf{n}^T(\mathbf{p}_i-\mathbf{c})\) 是点\(\mathbf{p}_i\) 到平面的有符号距离(因为\(\mathbf{n}\) 是单位向量)。
1.2 确定最优\(\mathbf{c}\)
首先证明最优的\(\mathbf{c}\) 是点云的质心\(\overline{\mathbf{c}}=\frac{1}{n}\sum_{i=1}^n\mathbf{p}_i\)。将目标函数对\(\mathbf{c}\) 求导(视为无约束优化,因为\(\mathbf{c}\) 可以任意取值)。先展开:
\[E(\mathbf{n},\mathbf{c})=\sum_{i=1}^{n}(\mathbf{n}^T\mathbf{p}_i-\mathbf{n}^T\mathbf{c})^2 \tag{3} \]
令\(d_i=\mathbf{n}^T\mathbf{p}_i\) ,则上式成为关于标量\(\mathbf{n}^T\mathbf{c}\) 的二次函数。为了求导方便,记\(t=\mathbf{n}^T\mathbf{c}\),则
\[E=\sum_{i=1}^{n}(d_i-t)^2 \tag{4} \]
这是关于\(t\) 的凸二次函数,最小值点在导数为零处:
\[\frac{dE}{dt}=-2\sum_{i=1}^{n}(d_i-t)=0 \]
由此可得
\[t=\frac{1}{n}\sum_{i=1}^nd_i \tag{5} \]
即
\[\mathbf{n}^T\mathbf{c}=\frac{1}{n}\sum_{i=1}^n\mathbf{n}^T\mathbf{p}i=\mathbf{n}^T\left(\frac{1}{n}\sum{i=1}^{n}\mathbf{p}_i\right)=\mathbf{n}^T\bar{\mathbf{p}} \tag{6} \]
上式对任意\(\mathbf{n}\) 成立,因此最优的\(\mathbf{c}\) 可取为\(\bar{\mathbf{p}}\) 。由于平面方程只要求\(\mathbf{c}\) 在平面上,我们可以直接令\(\mathbf{c}=\bar{\mathbf{p}}\) 。此时目标函数简化为:
\[E(\mathbf{n})=\sum_{i=1}^n\left(\mathbf{n}^T(\mathbf{p}_i-\bar{\mathbf{p}})\right)^2 \tag{7} \]
1.3 中心化数据与协方差矩阵
定义中心化(数据散点集去中心化)的点\(\mathbf{q}_i=\mathbf{p}_i-\bar{\mathbf{p}}\) ,则目标函数为:
\[E(\mathbf{n})=\sum_{i=1}^n(\mathbf{n}^T\mathbf{q}_i)^2 \tag{8} \]
写成矩阵形式:令矩阵\(\mathbf{Q}\in\mathcal{R}^{n\times3}\),其第\(i\)行为\(\mathbf{q}_i^T\),则
\[E(\mathbf{n})=\sum_{i=1}^n(\mathbf{q}_i^T\mathbf{n})^2=||\mathbf{Qn}||^2=(\mathbf{Qn})^T(\mathbf{Qn})=\mathbf{n}^T(\mathbf{Q}^T\mathbf{Q})\mathbf{n} \tag{9} \]
注意到\(\frac{1}{n}\mathbf{Q}^T\mathbf{Q}\) 正是点云的样本协方差矩阵(除以\(n\) 或\(n-1\) 不影响特征向量的方向,仅同步放缩特征值)。记 \(\mathbf{S}=\mathbf{Q}^T\mathbf{Q}\) ,则
\[E(\mathbf{n})=\mathbf{n}^T\mathbf{S}\mathbf{n} \tag{10} \]
由此上述问题转化为:在约束\(||\mathbf{n}||=1\)下,最小化 \(\mathbf{n}^T\mathbf{S}\mathbf{n}\) 。
1.4 转换为特征值问题
上述的优化问题是一个标准的瑞利熵(Rayleigh quotient)问题。引入拉格朗日乘子\(\lambda\),构造拉格朗日函数:
\[\mathcal{L}(\mathbf{n},\lambda)=\mathbf{n}^T\mathbf{S}\mathbf{n}-\lambda(\mathbf{n}^T\mathbf{n}-1) \tag{11} \]
对\(\mathbf{n}\) 求向量梯度并设为零:
\[\nabla_{\mathbf{n}}\mathcal{L}=2\mathbf{S}\mathbf{n}-2\lambda\mathbf{n}=0 \tag{12} \]
由此可得:
\[\mathbf{S}\mathbf{n}=\lambda\mathbf{n} \tag{13} \]
因此,任何满足约束的极值点\(\mathbf{n}\) 必须是\(\mathbf{S}\) 的特征向量,对应的特征值为\(\boldsymbol{\lambda}\)。此时的目标函数:
\[E(\mathbf{n})=\mathbf{n}^T\mathbf{S}\mathbf{n}=\mathbf{n}^T(\lambda\mathbf{n})=\lambda \tag{14} \]
所以,最小化\(E(\mathbf{n})\) 等价于寻找\(\mathbf{S}\) 的最小特征值\(\lambda_{min}\) ,对应的特征向量即为所求的法向量\(\mathbf{n}\)。
1.5 特征值与方差的关系(几何解释)
矩阵\(\mathbf{S}=\mathbf{Q}^T\mathbf{Q}=\lambda_1\mathbf{v}_1\mathbf{v}_1^T+\lambda_2\mathbf{v}_2\mathbf{v}_2^T+\lambda_3\mathbf{v}_3\mathbf{v}_3^T\) 是一个实对称的半正定矩阵,其特征值\(\lambda_1\geq\lambda_2\geq\lambda_3\)。由上述推导可知:
- 最大特征值\(\lambda_1\) 对应的特征向量\(\mathbf{v}_1\)使\(\mathbf{n}^T\mathbf{S}\mathbf{n}\) 最大,即点云在该方向上的投影方差最大,这是点云的主方向。
- 最小特征值\(\lambda_3\) 对应的特征向量\(\mathbf{v}_3\) 使投影方向方程最小,即点云在该方向上的分布最集中,因此该方向最适合最为平面的法向量。
从几何上看,PCA将数据投影到三个相互正交的方向上,使得投影后方差依次递减。最小方差方向恰好垂直于数据分布最"扁平"的方向,因此该方向就是拟合平面的法向。点云的质心位于平面上,因为它是所有点的平均位置,使得距离平方和最小。
1.6 拟合平面方程的确定
得到法向量\(\mathbf{n}=\mathbf{v}_3\) 和质心\(\mathbf{c}=\bar{\mathbf{p}}\) ,平面方程为:
\[\mathbf{v}_3^T(\mathbf{x}-\bar{\mathbf{p}})=0 \tag{15} \]
通常写作\(ax+by+cz+d=0\)的形式, 其中\((a,b,c)=\mathbf{v}_3^T\),且\(d=-\mathbf{v}_3\bar{\mathbf{p}}\)。
2. PCA平面拟合的算法步骤总结
根据上述算法推导,由此得到算法的具体步骤:
Step One: 计算质心:
\[\mathbf{c}=\frac{1}{n}\sum_{i=1}^{n}\mathbf{p}_i \tag{16} \]
Step Two: 中心化数据:将所有点减去质心\(\mathbf{c}\),得到零均值点集\(\mathbf{q}_i\):
\[\mathbf{q}_i=\mathbf{p}_i-\mathbf{c}\tag{17} \]
Step Three: 计算协方差矩阵:
\[\mathbf{C}=\frac{1}{n}\sum_{i=1}^n\mathbf{q}_i\mathbf{q}_i^T \tag{18} \]
在实际计算中,通常使用\(\mathbf{Q}\in{\mathcal{R}^{n\times{3}}}\) 表示中心化后的点云矩阵(每一行代表一个点),则\(\mathbf{C}=\frac{1}{n}\mathbf{Q}^T\mathbf{Q}\)。
Step Four: 协方差矩阵\(\mathbf{C}\) 进行特征值分解:
\[\mathbf{C}=\lambda_1\mathbf{v}_1\mathbf{v}_1^T+\lambda_2\mathbf{v}_2\mathbf{v}_2^T+\lambda_3\mathbf{v}_3\mathbf{v}_3^T \tag{19} \]
对协方差矩阵\(\mathbf{C}\) 进行特征值分解,得到特征值\(\lambda_1\geq\lambda_2\geq\lambda_3\) 及对应的特征向量\(\mathbf{v}_1,\mathbf{v}_2,\mathbf{v}_3\)。
Step Five: 提取法向量及得到,最下特征值\(\lambda_3\) 对应的特征向量\(\mathbf{v}_3\) 即为拟合平面的法向量\(\mathbf{n}\) 。由于特征向量是单位向量,无需额外归一化。
\[\mathbf{v}_3\cdot(\mathbf{x}-\mathbf{c})=0 \]
或者写为\(ax+by+cz+d=0\),其中\((a,b,c)=\mathbf{v}_3\),且\(d=-\mathbf{v}_3\cdot{\mathbf{c}}\)。
3. 算法应用注意事项
- 数据尺度:PCA对数据的尺度敏感,如果各轴单位不一致,应先进行标准化。但对于平面拟合,通常坐标单位一致(如米、毫米),无需额外处理。
- 特征值排序:确保取最小特征值对应的特征向量,而不是最大。
- 法向量方向:PCA得到的法向量方向是任意的(可能反向),可根据需要调整符号(如使法向量指向某个一致方向)。
- 与最小二乘的关系:上述方法等价于最小化点到平面距离的平方,即正交距离回归,而非沿某一坐标轴的残差。
4. Matlab 仿真实现
下面提供一个使用PCA进行三维点云平面拟合的 MATLAB完整案例。代码包含数据生成、手动PCA计算、结果可视化以及与真实平面的对比。
matlab
%% PCA平面拟合示例(MATLAB)
clear; clc; close all;
%% 1. 生成模拟数据:一个平面点云(带噪声)
% 真实平面方程:2x - y + 3z = 5 => 法向量 n_true = [2; -1; 3]/norm([2; -1; 3])
n_true = [2; -1; 3];
n_true = n_true / norm(n_true); % 单位法向量
d_true = -5; % 平面方程 n'*x + d = 0 中的 d
% 在平面上生成网格点
[x, y] = meshgrid(-5:0.5:5, -5:0.5:5);
z = -(n_true(1)*x + n_true(2)*y + d_true) / n_true(3);
points_clean = [x(:), y(:), z(:)];
% 添加高斯噪声(模拟真实点云)
noise = 0.2 * randn(size(points_clean));
points = points_clean + noise;
% 添加少量离群点(可选)
outliers = [8*randn(20,1), 8*randn(20,1), 8*randn(20,1)];
points = [points; outliers];
fprintf('生成点云数量:%d\n', size(points,1));
%% 2. PCA平面拟合(手动实现)
% 计算质心
centroid = mean(points, 1);
% 中心化
centered = points - centroid;
% 协方差矩阵(散布矩阵除以n-1)
C = cov(centered); % 等价于 centered' * centered / (n-1)
% 特征分解
[V, D] = eig(C); % V的列是特征向量,D对角线上是特征值
eigenvalues = diag(D);
% 最小特征值对应的特征向量即为法向量
[~, idx] = min(eigenvalues);
normal = V(:, idx); % 法向量方向(可能反向)
% 确保法向量指向一致(例如与真实法向量夹角小于90度)
if dot(normal, n_true) < 0
normal = -normal;
end
% 平面方程:normal'*(x - centroid) = 0 => normal'*x + d = 0, d = -normal'*centroid
d = -normal' * centroid(:);
fprintf('\n===== 拟合结果 =====\n');
fprintf('真实法向量: [%.4f, %.4f, %.4f]\n', n_true);
fprintf('拟合法向量: [%.4f, %.4f, %.4f]\n', normal);
fprintf('法向量夹角误差: %.4f 度\n', acosd(abs(dot(normal, n_true))));
fprintf('真实d: %.4f, 拟合d: %.4f\n', d_true, d);
%% 3. 可视化
figure('Position', [100 100 800 600]);
hold on; grid on; box on;
xlabel('X'); ylabel('Y'); zlabel('Z');
title('PCA平面拟合');
% 绘制点云
scatter3(points(:,1), points(:,2), points(:,3), 10, 'b', 'filled', 'DisplayName', '点云');
% 绘制拟合平面(在点云包围盒内绘制一个矩形平面)
% 确定平面范围
xlim = [min(points(:,1)), max(points(:,1))];
ylim = [min(points(:,2)), max(points(:,2))];
[X, Y] = meshgrid(linspace(xlim(1), xlim(2), 20), linspace(ylim(1), ylim(2), 20));
% 计算对应Z值:n1*X + n2*Y + n3*Z + d = 0 => Z = -(n1*X + n2*Y + d)/n3
Z = -(normal(1)*X + normal(2)*Y + d) / normal(3);
surf(X, Y, Z, 'FaceAlpha', 0.5, 'EdgeColor', 'none', 'FaceColor', 'r', 'DisplayName', '拟合平面');
% 绘制真实平面(半透明绿色)
Z_true = -(n_true(1)*X + n_true(2)*Y + d_true) / n_true(3);
surf(X, Y, Z_true, 'FaceAlpha', 0.3, 'EdgeColor', 'none', 'FaceColor', 'g', 'DisplayName', '真实平面');
legend('Location', 'best');
view(3);
axis equal;
%% 4. 使用MATLAB内置pca函数(等效方法)
% pca函数返回主成分系数(每列是一个主方向,按方差降序排列)
[coeff, score, latent] = pca(points);
% 最小方差方向对应最后一列主成分
normal_pca = coeff(:, 3);
if dot(normal_pca, n_true) < 0
normal_pca = -normal_pca;
end
fprintf('\n使用pca函数拟合的法向量: [%.4f, %.4f, %.4f]\n', normal_pca);
fprintf('与手动计算结果一致: %d\n', norm(normal - normal_pca) < 1e-10);
5.与传统最小二乘法平面拟合的对比与联系
PCA平面拟合(本质上是正交距离回归,也称为总体最小二乘法)与传统的最小二乘平面拟合 (通常指沿某一坐标轴方向的残差平方和最小,如\(z=ax+by+c\) 形式)是两种不同的方法,它们在目标函数、假设条件、计算复杂度和适用场景上存在显著差异。下面从多个维度进行详细比较。
5.1目标函数的不同
-
PCA平面拟合(正交回归)
最小化所有散点到拟合平面的垂直距离平方和:
\[E_{PCA}=\sum_{i=1}^n d_{\perp}^2(\mathbf{p}i,\boldsymbol{\Pi})=\sum{i=1}^n\left(\mathbf{n}^{T}(\mathbf{p}_i-\mathbf{c})\right)^2 \tag{20} \]
其中\(\mathbf{n}\) 是单位法向量,\(\mathbf{c}\) 是平面上一点(通常取质心)。该方法平等对待\(x,y,z\) 三个方向上的误差。
-
传统最小二乘平面拟合(以\(z=ax+by+c\)为例)
假设平面可表示为\(z=ax+by+c\),最小化的是沿\(z\)轴方向的偏差平方和:
\[E_{LS}=\sum_{i=1}^n\left(z_i-(ax_i+by_i+c)\right)^2 \tag{21} \]
这里仅考虑\(z\)方向的残差,而认为\(x,y\) 是无误差的(或作为自变量)。
4.2 假设条件
| 方法 | 误差假设 | 变量重要性 |
|---|---|---|
| PCA拟合 | 所有三坐标方向都存在观测误差,且误差在各向同性的高斯分布最优 | \(x,y,z\) 均为观测变量,无指标量、因变量之分 |
| 传统最小二乘法 | 仅因变量(如\(z\)) 存在误差,自变量\((x,y)\) 精确测量或无误差 | 明确区分自变量和因变量,通常选择一个坐标作为因变量 |
4.3 数值稳定性与适用场景
- 数值稳定性 :
- PCA方法在所有方向上具有相同的数值稳定性,不会因平面方向而退化。
- 传统最小二乘在平面接近垂直时,设计矩阵病态,解对噪声敏感。此时可考虑交换自变量/因变量角色,但需先验知识。
- 适用场景 :
- PCA拟合:适用于点云数据(如三维扫描、摄影测量)、物理测量中所有坐标均有误差的场景,以及需要各向同性拟合的场合。
- 传统最小二乘 :适用于明确存在因果关系的场景(如通过 \(x,y\) 预测 \(z\)),或数据中一个方向误差远小于其他方向时(例如精密仪器测量中 \(x,y\)已知准确)。
4.4 优缺点对比
PCA平面拟合(正交回归)
优点:
- 几何意义明确:直接最小化点到平面的真实距离,与坐标轴选择无关,具有旋转不变性。
- 无偏好方向:适用于所有坐标方向误差相当的情况,例如三维激光扫描点云数据。
- 统一框架:可通过特征分解直接得到全局解析解,无需迭代。
- 可处理任意方向的平面:即使平面接近垂直或水平,也能稳定求解。
缺点:
- 计算量稍大:需要计算协方差矩阵并进行特征分解(3×33×3 矩阵,计算成本很低,但在大数据量下仍需注意)。
- 对异常值敏感:平方距离会放大远离平面的离群点的影响(可通过鲁棒PCA改进)。
- 法向量方向二义性:特征向量符号不确定,需根据场景调整(如指向一致方向)。
传统最小二乘平面拟合(\(z=ax+by+c\))
优点:
- 计算简单:直接求解线性方程组(正规方程),无需特征分解。
- 易于解释 :当 \(z\)确实为因变量时(如高程数据),模型直观。
- 可扩展性强:容易引入加权、正则化等技巧。
缺点:
- 坐标依赖性 :结果依赖于选择哪个坐标作为因变量。若平面接近垂直(即 \(z\)变化缓慢而 \(x,y\) 变化大),模型会不稳定甚至失效。
- 非等方性误差:忽略 的误差可能导致有偏估计,尤其当所有变量都有噪声时。
- 不能处理垂直于因变量轴的平面 :例如平面垂直于 \(x\) 轴时,无法用 \(z=f(x,y)\)表示。
6.总 结
通过PCA拟合平面是一种简洁且鲁棒的方法,其本质是利用协方差矩阵的特征分解找到点云中方差最小的方向作为法线。该方法无需迭代,直接得到解析解,适用于各种三维点云数据。在实际应用中,可结合RANSAC等算法处理离群点,进一步提高稳定性。
| 特性 | PCA平面拟合(正交回归) | 传统最小二乘平面拟合(如 \(z=ax+by+c\)) |
|---|---|---|
| 优化目标 | 点到平面的垂直距离平方和 | 沿指定坐标轴(如 \(Z\))的偏差平方和 |
| 变量处理 | 所有变量对等,无自变量/因变量区分 | 需指定因变量,假设自变量无误差 |
| 计算复杂度 | 需特征分解(\(3\times{3}\) 矩阵),计算量略高 | 求解线性方程组,计算简单 |
| 数值稳定性 | 各向同性,对平面方向不敏感 | 平面接近垂直时可能病态 |
| 旋转不变性 | 是 | 否(依赖于坐标轴选择) |
| 适用数据 | 三维点云,所有坐标均有误差 | 存在明确因果关系的回归问题 |
| 对异常值敏感度 | 敏感(平方距离) | 敏感,但可通过加权改进 |
两种方法各有优劣,实际应用中应根据数据特点和具体需求选择合适的方法。在计算机视觉、遥感、机器人等领域,PCA平面拟合因其几何合理性和稳健性而被广泛采用。