算法原文:Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Clustering
1. 简介(Introduction)
随着低成本深度相机(如 Kinect)和 3D 传感器的普及,获取有序点云(organized point cloud)变得容易。这类点云在机器人和计算机视觉中广泛应用,但原始点云通常存在噪声、冗余,并缺乏语义信息。为了对 3D 场景进行紧凑、语义化建模,原始形状拟合(primitive fitting)成为一种重要方法,其中平面 是最关键的原始形状,因为人工环境(建筑、家具等)大多由平面构成。

本文提出了一种针对有序点云的高效平面提取算法,基于聚合层次聚类(Agglomerative Hierarchical Clustering, AHC),实现了实时性和高精度。
2. 算法背景(Related Work)
2.1 平面提取方法
-
RANSAC方法
- 利用随机采样一致性(RANSAC)迭代寻找平面模型并剔除内点。
- 缺点:随机采样选择和平面拟合计算开销大,速度慢。
- 改进:局部RANSAC、Hough变换预分割等。
-
区域生长方法(Region Growing)
- 根据点到平面的距离或 MSE 阈值,将邻近点扩展到平面。
- 缺点:需要每个点的法线估计,计算量大。
-
图结构方法(Graph-based)
-
将点云构建成图,通过节点和边表示点的聚类关系。
-
本文方法与前人区别:
- 不使用 RGB 信息
- 不需要每点法线估计
- 使用动态边权,自动选择合并顺序
-
2.2 平面在应用中的重要性
- 室内/室外三维重建与可视化
- 桌面物体操作(通过主要平面分割物体)
- SLAM 与定位(平面作为比点更稳定的地标)
3. 文章贡献(Contributions / 创新点)
-
高效的平面提取算法:
- 基于聚合层次聚类的算法适用于有序点云
- 不依赖每点法线估计,速度更快
-
复杂度分析:
- 聚类复杂度为 对数线性(log-linear)
- 能够实现实时性
-
实验验证:
- 对比最先进算法
- 对 640×480 点云,运行频率超过 35 Hz
- 精度与最先进方法可比
4. 需解决的关键问题
- 噪声与冗余数据:点云中噪声、缺失点或深度突变可能影响平面拟合。
- 平面边界精度:粗分割可能导致锯齿状边界(sawtooth)、过度分割或未分配数据点。
- 合并策略效率:如何在保证精度的前提下快速完成节点合并。
- 非重叠节点初始化:需要在图像空间均匀划分初始节点,避免重复点,提高速度。
5. 论文提出的算法流程(Algorithm Overview)
算法整体流程概览
-
输入
- 有序点云 F (organized point cloud,M×NM \times NM×N 点),如 Kinect 或深度相机获取的深度图。
-
输出
- 粗平面分割 B 和精细平面分割 C
- 对应的平面方程集 Π (粗)和 Π₀(精细)
-
三大步骤
- 图初始化 (Graph Initialization)
- 粗平面提取 (Agglomerative Hierarchical Clustering, AHC)
- 精细化分割 (Segmentation Refinement)
步骤 1:图初始化 (Graph Initialization)
目标:将有序点云划分为非重叠的初始节点,并构建图结构,节点表示点集,边表示邻居关系。
-
将点云 F 按 H×WH \times WH×W 的大小均匀划分为初始节点 vi,jv_{i,j}vi,j。
-
剔除不良节点(REJECTNODE):
- 节点包含缺失数据
- 节点包含深度不连续点
- 节点平面拟合 MSE 过大
-
初始化图边(REJECTEDGE):
- 根据节点法向量判断边是否保留,避免平面方向差异太大
-
得到图 G = (V, E),用于后续 AHC 合并
步骤 2:粗平面提取 (AHC)
目标:通过自底向上的层次聚类,将属于同一平面的节点合并。
-
为所有节点建立 最小 MSE 堆,快速找到当前最优合并节点。
-
循环执行:
-
取 MSE 最小的节点 vvv
-
对每个邻居 u∈N(v)u \in N(v)u∈N(v),尝试合并:
- 计算合并后节点 umerge=v∪uu_\text{merge} = v \cup uumerge=v∪u 的平面拟合 MSE
- 选择合并后 MSE 最小的邻居 ubestu_\text{best}ubest
-
判断合并结果:
- 如果 MSE(umerge)>TMSEMSE(u_\text{merge}) > T_\text{MSE}MSE(umerge)>TMSE → 合并失败,将节点 vvv 提取为一个粗平面
- 否则 → 合并成功,更新图结构和堆
-
-
输出粗平面集合 B 和对应平面方程 Π
关键优化:
- 使用 最小堆快速找到最优节点 → O(n log n)
- 节点合并时利用积分图或统计量 → 平面拟合 MSE 计算为常数时间
- 图为平面图,平均节点度 < 6 → 合并尝试次数有限
步骤 3:精细化分割 (Segmentation Refinement)
目标:修正粗分割中的边界错误、过分割或缺失点,提高平面精度。
-
腐蚀边界 (Erosion):
- 移除每个粗分割段 B 的边界节点,去掉锯齿状伪影。
-
区域生长 (Region Growing):
- 从腐蚀后的边界节点出发,按像素级邻居分配未使用的点到最近的平面段
- 更新小图 G₀ 中的节点和边
-
最终合并 (AHC):
- 在小图 G₀ 上再次执行 AHC 修正过分割问题
-
输出精细分割 C 和精细平面方程 Π₀
6. 核心方法细节(Core Method Details)
6.1 算法概述
图 2 展示了我们算法如何处理每一帧组织化点云。我们将 组织化点云 定义为一组二维索引的三维点
F=pi,j=(xi,j,yi,j,zi,j)T,i=1,...,M, j=1,...,N, F = { p_{i,j} = (x_{i,j}, y_{i,j}, z_{i,j})^T }, \quad i=1,\dots,M,\ j=1,\dots,N, F=pi,j=(xi,j,yi,j,zi,j)T,i=1,...,M, j=1,...,N,
其中二维索引 (i,j)(i,j)(i,j) 和 (i±1,j±1)(i \pm 1, j \pm 1)(i±1,j±1) 反映了点 pi,jp_{i,j}pi,j 与 pi±1,j±1p_{i\pm1,j\pm1}pi±1,j±1 在同一表面上的三维邻近关系(我们将该索引空间称为 图像空间 )。通常,它可以从深度图中获得,该深度图由 Kinect 传感器、飞行时间相机、结构光扫描系统,甚至通过旋转激光测距仪的扫描平面生成。

图 2. 算法概览。每一帧有序点云从左到右进行处理。(a) 显示图的初始化,每个节点根据其法向量着色;黑点和黑线表示图的节点和边;红色 "x"、黑色 "o"、红点分别表示因深度不连续、数据缺失和平面拟合均方误差过大而被拒绝的节点。(b) 和 © 显示 AHC 的两个核心操作。(b) 和 © 中随机颜色的区域表示至少被合并过一次的图节点。© 中黑色线条表示从节点 A 出发的所有边,其中粗线表示当节点 A 与其邻居合并时,产生最小平面拟合均方误差的边对应的节点 B。(d) 中彩色区域表示提取出的粗平面,如果应用需要,则在 (e) 中进行最终精细化。
A. 以线段提取为类比
在进入我们算法细节之前,我们简要讨论一个称为 线回归 (line regression) 的线段提取算法,如文献 21 所总结,并在 April Robotics Toolkit 22 中实现。该方法广泛用于从激光测距仪获取的二维点序列中提取线特征,并启发我们将其推广到三维点云中的快速平面提取。
如图 3 所示,序列中每 W 个连续点 (此图中 W=3W=3W=3)被分组为节点,形成一个 双向链表。然后对该链表执行 AHC(Agglomerative Hierarchical Clustering,自底向上的层次聚类):
- 找到具有最小线拟合均方误差 (MSE) 的节点 ggg;
- 将节点 ggg 与其左邻居或右邻居合并,使合并后的 MSE 最小。

图 3. 线性回归算法
- 蓝色点表示二维点。
- 用字母标记的圆圈表示链表中的节点。
- 方括号表示节点所代表的点集合。
- 粗线表示将节点 g 与其左邻居 ef 合并后的线拟合 MSE 小于将其与右邻居 h 合并的 MSE。
如果最小合并 MSE 大于预定义阈值(通常根据传感器噪声特性确定),则取消合并,节点 ggg 可被提取为一条线段。
使用 二叉堆 找最小 MSE 节点时,该算法可实现 对数线性时间复杂度 O(nlogn)O(n \log n)O(nlogn),其中 nnn 为序列中的点数。
注意,通过应用积分图(integral images)的思想,如文献 11,23 所用,合并两个节点并计算线拟合 MSE 可在 常数时间 完成。
B. 推广到 3D 的差异
受到点序列中邻域信息使用的启发,我们希望将二维线回归推广到 组织化点云中的三维平面提取,其中邻域信息由二维索引存储。然而,这一推广并非易事,主要有两个区别:
1 节点不重叠
与线回归不同,初始节点(以及在合并过程中产生的任意两个节点)不能有相同的点 ,即对于任意两个节点 Bs,Bt⊂FB_s, B_t \subset FBs,Bt⊂F,必须满足
Bs∩Bt=∅. B_s \cap B_t = \emptyset. Bs∩Bt=∅.
这是因为经过多次合并后,属于某个节点 BsB_sBs 的三维点会形成不规则形状,而不再保持其在图像空间中的初始矩形形状,如图 2(b) 所示。因此,如果允许不同节点包含相同点,即使借助积分图,也难以高效处理节点合并时的重叠点。
而在线回归中,合并相邻线段仍然只需记录起点和终点索引,因此允许节点重叠是可行的。值得注意的是,节点重叠的好处是可以自动检测线段边界:包含不同线段点的节点倾向于产生较大的线拟合 MSE(例如图 3 中的节点 c、d、h),其合并尝试会被延迟并最终被拒绝。
我们算法中要求节点不重叠,因此失去了自动检测平面边界的优势。我们将在 第 6.3-A 节 描述如何通过初始化步骤去除坏节点来克服这一劣势,并在 第 6.4 节描述一种像素级的区域生长算法以精细化平面边界。
2 合并尝试次数
在线回归中,将节点与其邻居合并是 常数时间操作,最多只需尝试两个方向(左或右邻居)。
而在我们的情况中,合并尝试次数更多:
- 初始节点最多连接 4 个邻居形成图结构;
- 经过多次合并后,节点可能与更多邻居相连。
我们将在 第 6.3-B 节 实验分析算法中平均合并尝试次数,并展示在实际中它保持较小。因此,合并步骤仍可在 常数时间 完成,使得整体复杂度与线回归相似,为 O(nlogn)O(n \log n)O(nlogn)。
6.2 快速粗略分割 (FAST COARSE SEGMENTATION)
我们的快速平面提取算法主要由三个步骤组成,如图 2 和算法 1 所示:
- 算法首先初始化一个图结构;
- 然后执行 自底向上的层次聚类 (AHC, Agglomerative Hierarchical Clustering) 提取粗平面;
- 最后进行精细化。

如果应用只需要 平面区域的粗略分割 ,例如在点云中检测物体,则可以跳过最后的精细化步骤,这样在 640×480640 \times 480640×480 点的情况下,帧率可超过 50Hz。
首先明确符号:
- FFF 表示一帧完整的组织化点云,包含 MMM 行 NNN 列点。
- B,CB, CB,C 分别表示粗分割和平面精细分割,即 Bk/ClB_k / C_lBk/Cl 是一个 平面片段 ,由一组 3D 点 pi,jp_{i,j}pi,j 组成。
- Π,Π0\Pi, \Pi_0Π,Π0 分别为 B,CB, CB,C 对应的平面方程集合。
- 注意,图 GGG 的每个节点 vvv 是一组 3D 点,每条无向边 uvuvuv 表示图像空间中平面片段 u,vu, vu,v 的邻域关系。
A. 图初始化 (Graph Initialization)
如 第 6.2-B 节 所述,我们算法要求 初始化节点不重叠(见算法 2 第 3--5 行)。
- 该步骤在图像空间中将点云均匀划分为大小为 H×WH \times WH×W 的初始节点集合。
- 这种要求导致算法失去自动检测平面边界的优势。
为了在 AHC 下正确分割平面,我们从图中移除以下类型的节点及对应边,如图 4 所示:

- 高 MSE 节点:非平面区域导致平面拟合 MSE 较高,直接移除。
- 包含缺失数据的节点:由于传感器限制,场景部分区域可能未被正确感知,导致数据缺失(例如百叶窗后面的玻璃窗)。
- 包含深度不连续的节点:这些节点包含两组在 3D 中不接近但在图像空间接近的点(通常一个表面部分遮挡另一个表面,例如显示器遮挡墙壁)。如果对该节点执行 PCA 拟合平面,拟合平面会几乎平行于视线方向,因此 MSE 仍然较小。将该"异常"节点与邻居节点合并,会对平面拟合结果产生不良影响,这是最小二乘法过度加权异常值的已知问题。
- 位于两平面边界的节点:这些节点包含两组在 3D 中接近但位于不同平面的点(例如房间角落),若合并到其中一个平面,会降低平面拟合精度。
算法 2 中的 REJECTNODE 和 REJECTEDGE 函数用于减少这四类不良初始节点的影响:
REJECTNODE:移除前三类不良节点(及其包含的点);REJECTEDGE:减轻第四类节点的影响。
值得注意的是,这种不重叠"缺点"的一个收获是 避免了对每个点计算法向量。
- 初始化步骤可视作将节点内部所有点视作具有相同平面法向量。
- 这是我们相比其他方法速度提升的重要原因------其他方法往往在每个点的法向量估计上花费大量时间。

B. 自底向上的层次聚类 (Agglomerative Hierarchical Clustering)
如 算法 3 所示,我们的 AHC 与线回归几乎相同,但操作对象是 图而非双向链表。
-
首先构建 最小堆,高效查找当前平面拟合 MSE 最小的节点。
-
重复以下步骤:
- 找到图中当前平面拟合 MSE 最小的节点 vvv;
- 将其与邻居节点 ubestu_{\text{best}}ubest 合并,使合并后的 MSE 最小(回忆:图中每个节点是一组点,合并 MSE 为两组点的联合平面拟合 MSE)。
-
若最小合并 MSE 超过预定义阈值 TMSET_{\text{MSE}}TMSE(不一定是固定参数,见第 6.3-C 节说明),则找到并提取一个平面片段 vvv;
-
否则,将合并节点 umergeu_{\text{merge}}umerge 通过边收缩加入图中。
如 第 6.2-B 节 所述,我们算法要求的合并尝试次数比线回归多,但仍然高效,实际聚类过程可在 O(nlogn)O(n \log n)O(nlogn) 时间内完成。
- 图 5 显示了每帧 AHC 平均合并尝试次数。
- 不论初始节点大小(即初始节点数),平均尝试次数保持较小。
- 原因:算法 2 构建的图为 平面图。根据图论,平面图平均节点度严格小于 6。
- 我们的初始图为平面图,边收缩合并节点不会改变平面性,因此 AHC 过程中平均节点度始终小于 6。
- 大片段的平面拟合 MSE 大于小片段(假设误差服从同一高斯分布),AHC 倾向平衡所有片段的大小,先增长 MSE 最小的节点,再切换到其他较小节点,避免单个大节点过度增长。
因此,算法 3 第 6--21 行可在 常数时间 完成,O(nlogn)O(n \log n)O(nlogn) 复杂度仅来自维护最小堆。

C. 实现细节 (Implementation Details)
为了提高快速粗略分割的速度与精度,有几个实现细节:
-
并查集 (Disjoint Set)
- 用于跟踪每个初始节点 vi,jv_{i,j}vi,j 的点成员关系。
-
节点统计量
- 类似线回归,所有节点维护所属点的一阶和二阶统计量:
∑xi,j,∑yi,j,∑zi,j,∑xi,j2,∑yi,j2,∑zi,j2,∑xi,jyi,j,∑yi,jzi,j,∑zi,jxi,j \sum x_{i,j}, \quad \sum y_{i,j}, \quad \sum z_{i,j}, \quad \sum x_{i,j}^2, \quad \sum y_{i,j}^2, \quad \sum z_{i,j}^2, \quad \sum x_{i,j} y_{i,j}, \quad \sum y_{i,j} z_{i,j}, \quad \sum z_{i,j} x_{i,j} ∑xi,j,∑yi,j,∑zi,j,∑xi,j2,∑yi,j2,∑zi,j2,∑xi,jyi,j,∑yi,jzi,j,∑zi,jxi,j
- 这样合并两个节点并通过 PCA 计算平面方程和 MSE 可在 常数时间完成。
-
深度不连续检测
REJECTNODE函数中判断深度不连续依赖传感器噪声特性。- 对 Kinect 传感器,使用文献 23 与 PCL 建议函数:
f(pa,pb)={1,if ∣za−zb∣>2α(∣za∣+0.5) 0,otherwise f(p_a, p_b) = \begin{cases} 1, & \text{if } |z_a - z_b| > 2\alpha(|z_a| + 0.5) \ 0, & \text{otherwise} \end{cases} f(pa,pb)={1,if ∣za−zb∣>2α(∣za∣+0.5) 0,otherwise
- 单位为毫米,参数 α\alphaα 取 0.01∼0.020.01 \sim 0.020.01∼0.02。
-
平面片段提取阈值 TMSET_{\text{MSE}}TMSE
- 与传感器相关。
- 对 Kinect,采用文献 24 的公式:
TMSE=(σz2+ϵ)2 T_{\text{MSE}} = (\sigma_z^2 + \epsilon)^2 TMSE=(σz2+ϵ)2
- 其中 σ=1.6×10−6\sigma = 1.6 \times 10^{-6}σ=1.6×10−6,ϵ∈3,8\epsilon \in 3, 8ϵ∈3,8。
- 角度阈值 TANGT_{\text{ANG}}TANG 也可随深度调整。
-
初始节点形状
- 节点应接近正方形,即 W≈HW \approx HW≈H。
- 若使用条状节点(W≫HW \gg HW≫H 或 H≫WH \gg WH≫W),PCA 拟合平面法向会错误,通常接近视线方向,导致 AHC 分割失败。
6.3. 分割精细化 (SEGMENTATION REFINEMENT)
对于许多应用场景,上一节得到的 粗平面分割 可能不够精确,尤其是当应用需要 平面边界信息 或对 平面方程精度 有较高要求时。因此,我们对粗分割 BBB 进行 精细化处理。
粗分割中常见的三类问题,如图 6 所示:
- 锯齿状 (Sawtooth):通常出现在两个相连平面的边界处。
- 未使用的数据点 (Unused Data Points):通常出现在遮挡边界或缺失数据节点处。
- 过度分割 (Over-Segmentation):通常出现在两个物体的遮挡边界之间。
- 锯齿状会导致少量异常点被包含在平面估计中;
- 未使用数据点和过度分割会导致有效内点减少。
- 所有这些问题都会产生 不准确的平面边界 ,并稍微降低平面方程估计的精度。

解决方案 (Algorithm 4)
-
锯齿状处理
- 锯齿状问题几乎总是在 BBB 的边界区域出现。
- 对每个平面片段的边界区域进行 腐蚀 (erosion) 可以有效去除锯齿(算法第 5--13 行)。
-
像素级区域生长 (Pixel-wise Region Growing)
-
从所有新的边界点开始,对未使用的数据点进行分配:
- 将每个未使用点分配到之前提取的最近平面。
-
在区域生长过程中,发现每个平面 BkB_kBk 的 4-邻域 ,形成一个新的图 G′G'G′(算法第 14--27 行)。
-
-
修复过度分割
- 对 G′G'G′(通常小于 30 个节点)再次应用 AHC ,可以解决过度分割问题(算法第 28 行)。

- 对 G′G'G′(通常小于 30 个节点)再次应用 AHC ,可以解决过度分割问题(算法第 28 行)。
总结:
- 该精细化方法通过 边界腐蚀 + 像素级区域生长 + 小规模 AHC,解决了粗分割中的三类主要问题。
- 可以得到 更准确的平面边界 和 更精确的平面方程,适用于需要高精度的 SLAM 或 3D 感知任务。
7. 算法优势(Advantages)
- 实时性高:640×480 点云 >35 Hz
- 精度高:与最先进算法可比
- 无需每点法线估计 → 大幅减少计算量
- 动态边权 → 合并顺序自适应
- 适合有序点云:Kinect、ToF、结构光等
8. 算法流程总结(Flowchart)
- 输入有序点云 FFF
- Graph Initialization → 初始节点 VVV,边 EEE
- AHC 聚合 → 粗平面 BBB
- Segmentation Refinement → 精细平面 CCC
- 输出平面集合 CCC 及平面方程 Π0\Pi_0Π0
9. 参考文献(Selected References)
- O. Faugeras, "Three-Dimensional Computer Vision," MIT Press, 1993.
- RANSAC-based plane extraction: Fischler & Bolles, 1981.
- Region growing: Hahnel et al., 2003
- PCA-based plane fitting: Holz et al., 2012
- Fast plane extraction with line regression ideas: Geogiev et al., 2010
- Graph-based segmentation: Enjarini et al., 2014