如何移除XYZ相同分类不同的重复LAS点云:保留Class 6删Class 0重复项
针对LAS文件重复点过滤的解决方案
以下是几种不同工具的实现方法,可精准保留80个唯一未分类点(Class 0)和20个建筑物点(Class 6),移除与Class 6重复的Class 0点:
使用laspy(Python)实现
通过分组判断重复属性组,在同时包含Class 0和Class 6的组中移除Class 0点:
import laspy import numpy as np # 读取输入LAS文件 las = laspy.read("input.las") # 组合用于判定重复的核心属性(根据实际文件属性调整,确保覆盖所有重复维度) key_fields = np.column_stack([ las.x, las.y, las.z, las.intensity, las.scan_angle_rank ]) # 获取每个唯一属性组的索引映射 unique_keys, inverse_group_ids = np.unique(key_fields, axis=0, return_inverse=True) # 初始化保留掩码 keep_mask = np.ones(len(las), dtype=bool) # 遍历每个属性组 for group_id in range(len(unique_keys)): # 筛选当前组的所有点 group_mask = inverse_group_ids == group_id group_classes = las.classification[group_mask] # 若组内同时存在Class 0和Class 6,移除组内的Class 0点 if 0 in group_classes and 6 in group_classes: class0_to_remove = group_mask & (las.classification == 0) keep_mask[class0_to_remove] = False # 生成并保存过滤后的LAS文件 filtered_las = laspy.LasData(las.header) filtered_las.points = las.points[keep_mask] filtered_las.write("output.las")
使用lidR(R)实现
利用lidR的分组和过滤功能,实现精准筛选:
library(lidR) # 读取LAS文件 las <- readLAS("input.las") # 按核心属性分组,过滤规则:组内有Class 6则保留Class 6,否则保留Class 0 las_filtered <- las %>% group_by(X, Y, Z, Intensity, ScanAngleRank) %>% filter(ifelse(any(Classification == 6), Classification != 0, TRUE)) %>% ungroup() # 保存结果 writeLAS(las_filtered, "output.las")
使用PDAL实现
通过JSON pipeline定义处理流程,完成分组和条件过滤:
创建名为filter_duplicates.json的配置文件:
{ "pipeline": [ "input.las", { "type": "filters.groupby", "dimension": "X,Y,Z,Intensity,ScanAngleRank" }, { "type": "filters.expression", "expression": "!(Classification == 0 && @group:Classification contains 6)" }, { "type": "writers.las", "filename": "output.las" } ] }
执行命令运行pipeline:
pdal pipeline filter_duplicates.json
使用LAStools实现
通过lasduplicate标记重复点,再结合las2las过滤目标点:
- 先导出重复点的分组信息:
lasduplicate -i input.las -o duplicate_groups.txt -list -v
- 手动或通过脚本处理
duplicate_groups.txt,提取同时包含Class 0和Class 6的组中Class 0点的ID; - 使用
las2las移除这些目标点:
las2las -i input.las -o output.las -keep_all -drop_point_ids_from_file duplicate_class0_ids.txt
或者直接使用las2las的表达式过滤(需确认LAStools版本支持组内条件判断):
las2las -i input.las -o output.las -keep_class 6 -keep_class 0 -drop_if "Classification == 0 && (X,Y,Z,Intensity,ScanAngleRank) in (select X,Y,Z,Intensity,ScanAngleRank from input.las where Classification == 6)"
内容的提问来源于stack exchange,提问作者rv94
相关产品推荐
相关产品推荐

