本文以桥墩点云为例,介绍一种基于区域生长思想的点云分割方法。程序通过手动选择初始种子点,并根据邻域点与当前点之间的法向量夹角和曲率差异不断向外扩展,最终提取出与种子点所在表面几何特征相近的点云区域。

1 引言
三维激光扫描可以快速获取桥梁结构的空间几何信息,但原始点云通常包含大量点,且不同结构表面混杂在一起。对于桥墩、梁体、桥面板等构件而言,如果想进一步进行几何尺寸提取、表面拟合或数字化建模,首先需要从完整点云中提取出目标区域。
点云分割就是完成这一任务的重要步骤。本文以桥墩点云为例,介绍一种基于区域生长思想的点云分割方法。程序通过手动选择一个初始种子点,然后根据邻域点与当前点之间的法向量夹角和曲率差异,不断向外扩展,最终提取出与种子点所在表面几何特征相近的点云区域。
2 程序特点
- 直接读取 PLY 格式桥墩点云;
- 不进行 ROI 裁剪,保留完整点云作为输入;
- 通过数据光标交互式选择初始种子点;
- 基于法向量夹角和曲率差异进行区域生长;
- 只保留输入点云、种子点选择和分割结果三个主要图。
3 区域生长分割的基本思想
区域生长是一类典型的点云分割方法。它的核心思想是:从一个或多个初始种子点出发,在其邻域范围内搜索与当前区域具有相似几何特征的点,并将满足条件的点加入当前区域。随后,新加入的点又可以作为新的生长点继续向外扩展,直到没有新的点满足生长条件为止。
对于三维点云而言,常用的区域生长判断条件包括点与点之间的空间距离、局部法向量夹角、局部曲率差异以及点云密度或高度差等其他几何特征。
在桥墩点云中,同一平面或同一连续表面上的点通常具有较为接近的法向量方向,曲率变化也相对平缓。而在边角、遮挡、突变或不同结构面交界处,法向量方向和曲率往往会发生明显变化。因此,可以利用法向量夹角和曲率差异作为区域生长的主要判据。
4 程序整体流程
读取桥墩点云 → 显示输入点云 → 交互式选择初始种子点 → 计算点云法向量和曲率 → 建立 k 近邻索引 → 从种子点开始区域生长 → 输出分割结果
5 桥墩点云读取与显示
程序首先通过文件选择窗口读取 .ply 格式点云文件。读取后,将点云坐标整理为 N × 3 的矩阵形式,并删除无效点。这一处理可以避免不同点云格式带来的维度不一致问题,也可以防止无效坐标影响后续计算。
随后,程序使用 pcshow 显示输入点云,并将背景设置为白色、坐标轴设置为黑色,便于后续截图和公众号排版。

图1 输入桥墩点云
6 初始种子点选择
区域生长算法需要一个初始点作为生长起点。本文采用手动交互方式选择种子点。程序运行到选点步骤后,会弹出一个点云窗口,用户在点云上点击目标位置,生成数据提示框,然后按下 Enter 键确认。
为了保证选中的位置能够对应到点云中的真实点,程序会计算点击位置与所有点之间的距离,并选择距离最近的点作为真正的种子点。

图2 初始种子点选择
7 法向量与曲率计算
区域生长分割的关键在于判断邻域点是否与当前点属于同一连续表面。本文采用 PCA 方法计算点云局部法向量和曲率。
简单来说,PCA 法向量估计的基本思想是在某个点的局部邻域内,寻找一个最能代表该局部点集空间分布的拟合平面,该平面的法向方向即可作为该点的法向量。曲率则可以反映局部点云表面的弯曲程度。
8 区域生长参数设置

其中,Angle_th = 4 表示当邻域点与当前点的法向量夹角小于 4° 时,认为二者具有相似的局部表面方向。
参数设置对分割结果影响较大。Angle_th 越小,分割结果越严格,区域可能偏小;Angle_th 越大,分割结果越宽松,可能扩展到其他表面。Curvature_th 越小,区域生长越难跨越边缘或突变位置;grow_k 越大,邻域搜索范围越广,但也更容易跨越边界。
9 k 近邻搜索
为了提高区域生长效率,程序提前计算完整点云中每个点的 k 近邻。由于每个点的最近邻通常是它自身,因此实际使用邻域点时,需要从第二个点开始,这样可以避免当前点被重复参与判断。
10 区域生长分割实现
区域生长过程使用队列实现。首先,将初始种子点加入队列。随后,程序不断从队列中取出当前生长点,搜索其邻近点,并计算法向量夹角。
如果邻域点与当前点之间的法向量夹角小于设定阈值,则将其加入当前分割区域。进一步地,如果该点与当前点之间的曲率差异也小于设定阈值,则将其加入队列,作为新的生长点继续向外扩展。
11 分割结果展示
完成区域生长后,程序将原始点云和分割点云叠加显示。分割结果用彩色点显示,初始种子点用红色圆圈标记。
从分割结果可以看出,区域生长算法能够从初始种子点出发,提取出与其局部几何特征相近的点云区域。分割结果主要受法向量夹角阈值、曲率阈值以及邻域点数量影响。

图3 桥墩点云区域生长分割结果
12 参数调整建议
在实际点云处理中,不同数据的点云密度、噪声水平和结构复杂程度不同,因此参数需要结合具体数据进行调整。
如果分割区域明显偏小,可以适当增大 Angle_th,例如从 4° 调整为 6° 或 8°。如果分割结果跨越到其他结构面,可以适当减小 Angle_th 或 Curvature_th。
如果点云噪声较多,可以适当增大 pca_k,使法向量估计更加平滑。如果点云较稀疏,可以适当减小 grow_k,避免邻域搜索跨越真实边界。需要说明的是,区域生长算法并不存在一组适用于所有点云的固定参数,实际使用时应根据点云密度、目标表面平整程度和分割效果反复调整参数。
13 小结
本文以桥墩点云为例,介绍了 MATLAB 中基于区域生长思想的点云分割方法。程序首先读取 PLY 格式点云文件,然后通过数据光标交互式选择初始种子点,进一步利用 PCA 方法计算点云法向量和曲率,最后根据法向量夹角和曲率差异完成区域生长分割。
该程序流程清晰,结果直观,适合用于点云分割算法入门学习。后续可以在此基础上继续扩展,例如加入多种子点选择、自动种子点检测、ROI 裁剪、分割结果导出以及桥梁构件自动识别等功能