【第一期:MATLAB点云处理基础】LAS点云数据导入与可视化

在桥梁、道路、建筑物等三维点云处理中,.las 是非常常见的激光雷达点云格式。本文不展开复杂的格式标准,只以 Bridge.las 为例,演示如何在 MATLAB 中完成点云读取、信息查看、可视化和简单裁剪。

准备条件:建议安装 MATLAB Lidar Toolbox,并将 Bridge.las 放在当前 MATLAB 工作路径下。

1. Bridge.las 数据准备

假设当前已经有一个点云文件 Bridge.las。最简单的做法是把它和 MATLAB 脚本放在同一个文件夹中。

复制代码
fileName = "Bridge.las";

如果文件不在当前路径,也可以直接写完整路径:

复制代码
fileName = "D:\PointCloud\Bridge.las";

2. LAS 点云可以理解成什么?

对初学者来说,可以先把 LAS 文件理解为一种专门保存三维点云的文件。它最核心的信息就是每个点的 X、Y、Z 坐标。

有些 LAS 文件还会保存强度、分类、回波信息、颜色和 GPS 时间等属性。但本文先不展开这些内容,重点掌握最基础的读取和显示流程。

3. 读取 Bridge.las 点云

MATLAB 中读取 LAS 文件主要用两个函数:lasFileReader 用来创建读取器,readPointCloud 用来真正读取点云。

复制代码
clc; clear; close all;
%% 1. 设置 LAS 文件路径
fileName = "Bridge.las";
%% 2. 创建 LAS 文件读取器
lasReader = lasFileReader(fileName);
%% 3. 读取点云
ptCloud = readPointCloud(lasReader);
%% 4. 显示点云
figure;
pcshow(ptCloud.Location);
axis equal;
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Bridge.las Point Cloud');

运行这段代码后,就可以在 MATLAB 图窗中看到 Bridge.las 的三维点云。

4. 查看点云基本信息

在正式处理点云之前,建议先查看一下文件的基本信息,例如点数量、坐标范围等。

复制代码
disp(lasReader);
fprintf('点云数量:%d\n', lasReader.Count);
fprintf('X范围:%.3f ~ %.3f\n', lasReader.XLimits(1), lasReader.XLimits(2));
fprintf('Y范围:%.3f ~ %.3f\n', lasReader.YLimits(1), lasReader.YLimits(2));
fprintf('Z范围:%.3f ~ %.3f\n', lasReader.ZLimits(1), lasReader.ZLimits(2));

其中 Count 表示点云总数量,XLimits、YLimits 和 ZLimits 分别表示点云在三个方向上的坐标范围。

5. 获取点云坐标

读取后的 ptCloud 是 MATLAB 的 pointCloud 对象。如果想得到普通的三列坐标矩阵,可以使用 Location 属性。

复制代码
XYZ = ptCloud.Location;
X = XYZ(:,1);
Y = XYZ(:,2);
Z = XYZ(:,3);
% 查看前 5 个点
XYZ(1:5,:)

这样就可以把点云坐标提取出来,用于后续的裁剪、滤波、配准、识别和重建等操作。

6. 按高度给点云着色

默认显示有时候不够直观。对于桥梁点云,可以按照高度 Z 值进行着色,这样结构起伏会更加清楚。

复制代码
XYZ = ptCloud.Location;
Z = XYZ(:,3);
figure;
pcshow(XYZ, Z, 'MarkerSize', 20);
axis equal;
colormap(jet);
colorbar;
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Bridge Point Cloud Colored by Height');

这种显示方式适合快速观察桥面、桥墩、地面和周边结构之间的高度差异。

7. 常见问题

问题一:为什么提示找不到 Bridge.las?

一般是因为 MATLAB 当前工作路径下没有这个文件。可以使用 pwd 查看当前路径,或者把 fileName 改成完整文件路径。

问题二:为什么点云显示很小或者不清楚?

可以增加 axis equal、view(3),并适当调大 MarkerSize。

问题三:为什么文件很大,读取很慢?

可以先用 ROI 读取局部区域,后续再进行降采样、滤波或构件识别。

以 Bridge.las 为例,介绍了 MATLAB 读取 LAS 点云的基本流程:创建读取器、读取点云、查看信息、提取坐标、按高度着色显示,以及进行简单区域裁剪。

对于点云处理来说,读取和显示是第一步。后续可以继续进行点云裁剪、降采样、滤波、边界提取、构件识别和三维重建等操作。

8. 完整示例代码

下面给出点云数据和完整代码,下载点云数据并复制代码到 MATLAB 中即可运行。

复制代码
clc; clear; close all;
%% 1. 设置 LAS 文件路径
fileName = "Bridge.las";
%% 2. 创建 LAS 文件读取器
lasReader = lasFileReader(fileName);
%% 3. 读取点云
ptCloud = readPointCloud(lasReader);
%% 4. 显示点云
figure;
pcshow(ptCloud.Location);
axis equal;
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Bridge.las Point Cloud');
disp(lasReader);
fprintf('点云数量:%d\n', lasReader.Count);
fprintf('X范围:%.3f ~ %.3f\n', lasReader.XLimits(1), lasReader.XLimits(2));
fprintf('Y范围:%.3f ~ %.3f\n', lasReader.YLimits(1), lasReader.YLimits(2));
fprintf('Z范围:%.3f ~ %.3f\n', lasReader.ZLimits(1), lasReader.ZLimits(2));
XYZ = ptCloud.Location;
X = XYZ(:,1);
Y = XYZ(:,2);
Z = XYZ(:,3);
% 查看前 5 个点
XYZ(1:5,:)
XYZ = ptCloud.Location;
Z = XYZ(:,3);
figure;
pcshow(XYZ, Z, 'MarkerSize', 20);
axis equal;
colormap(jet);
colorbar;
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Bridge Point Cloud Colored by Height');
xmin = lasReader.XLimits(1);
xmax = lasReader.XLimits(1) + 0.5 * range(lasReader.XLimits);
ymin = lasReader.YLimits(1);
ymax = lasReader.YLimits(2);
zmin = lasReader.ZLimits(1);
zmax = lasReader.ZLimits(2);
roi = [xmin xmax ymin ymax zmin zmax];
ptCloud_roi = readPointCloud(lasReader, ROI=roi);
figure;
pcshow(ptCloud_roi.Location, 'MarkerSize', 20);
axis equal;
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Cropped Bridge Point Cloud');
相关推荐
2zcode1 小时前
基于Matlab不规则颗粒粒径周长面积测量及计数系统
开发语言·算法·matlab
renhongxia11 小时前
开源大模型VS闭源大模型:2026年格局再梳理
深度学习·算法·语言模型·分类·开源
笨笨饿1 小时前
#85_库函数开发
linux·c语言·网络·stm32·单片机·算法·个人开发
绛橘色的日落(。・∀・)ノ1 小时前
深度学习 反向传播与计算图实验
算法
Tisfy1 小时前
LeetCode 1914.循环轮转矩阵:大模拟(数组原地轮转) —— 附O(1)空间版本
算法·leetcode·矩阵·大模拟
Hello.Reader1 小时前
算法基础(三)—— 插入排序从整理扑克牌到有序数组
java·算法·排序算法
50万马克的面包1 小时前
C语言:三大基础排序算法模板 冒泡 / 选择 / 插入)
c语言·笔记·算法·排序算法
罗超驿1 小时前
3.快乐数专题学习笔记——双指针法在LeetCode 202题中的应用
java·算法·leetcode·职场和发展
无限进步_1 小时前
【C++】深入底层:自己动手实现一个哈希表
开发语言·数据结构·c++·算法·链表·散列表·visual studio