Open3D边缘检测技术从3D数据中精准识别并提取边界,对于场景解析、物体轮廓提取等任务至关重要。Open3D提供多种算法,帮助用户高效实现边缘检测,促进3D数据的深度分析和应用。
一、安装
pip install open3d # 即可
二、使用
首先,导入open3d库,并读取点云数据
import open3d as o3d
cloud = o3d.t.io.read_point_cloud("your_cloud_path")
其次,从点云中移除统计异常值(即噪点或离群点)
# estimate_normals估计点云数据中每个点的法线向量。法线信息对于后续的处理如表面重建、形状分析等都非常有用。
cloud.estimate_normals(radius=0.02, max_nn=30)
# 从点云中移除统计异常值(即噪点或离群点)
cl, ind = cloud.remove_statistical_outliers(nb_neighbors=20, std_ratio=2.0)
# 原始点云cloud被更新为只包含过滤后的点,且这些点的位置信息已经被更新
cloud.point['positions'] = cl.point['positions']
estimate_normals 参数详解
radius=0.02
参数指定了搜索每个点周围邻近点的半径范围。在这个半径内的点将被用来计算该点的法线向量。max_nn=30
参数限制了用于计算法线的最大邻近点数。即使在指定的半径内有更多的点,也只会使用最近的30个点进行计算。
remove_statistical_outliers 参数详解
nb_neighbors=20
参数指定了用于计算每个点平均距离的邻近点数。std_ratio=2.0
参数是标准差倍数,用于确定哪些点被认为是异常值。如果一个点的平均距离大于全局平均距离加上这个倍数的标准差,那么该点就被认为是异常值
remove_statistical_outliers
方法返回两个对象:过滤后的点云cl
和一个索引数组ind
,后者包含了原始点云中保留点的索引。
然后,检测图像边界点
boundary, mask = cloud.compute_boundary_points(0.5, 60)'''0.5 是指定的搜索半径(以米为单位,具体取决于你的点云数据的尺度)。在这个半径内搜索每个点的邻近点。
60 是邻近点的数量阈值。如果一个点在指定的搜索半径内找到的邻近点数量少于这个阈值,那么该点就被认为是边界点。
compute_boundary_points 方法返回两个对象:boundary 是一个点云对象,它只包含原始点云中被识别为边界点的那些点。
mask 是一个布尔数组,其长度与原始点云中点的数量相同。对于原始点云中的每个点,如果它是边界点,则mask中对应位置的值为True;否则为False'''
最后,通过设置不同颜色进行区分,将图像展示出来
cloud = cloud.paint_uniform_color([0.6, 0.6, 0.6]) # 灰色
boundary = boundary.paint_uniform_color([1.0, 0.0, 0.0]) # 红色,rgbo3d.visualization.draw_geometries([boundary.to_legacy(), cloud.to_legacy()])
完整代码
import open3d as o3dcloud = o3d.t.io.read_point_cloud(r"D:\gitlab\abnormal_part_inspection\ms7193.ply")cloud.estimate_normals(radius=0.5, max_nn=60)
cl, ind = cloud.remove_statistical_outliers(nb_neighbors=20, std_ratio=5.0)
cloud.point['positions'] = cl.point['positions']
cloud.estimate_normals(radius=0.5, max_nn=60)boundary, mask = cloud.compute_boundary_points(0.5, 60)
cloud = cloud.paint_uniform_color([0.6, 0.6, 0.6])
boundary = boundary.paint_uniform_color([1.0, 0.0, 0.0])o3d.visualization.draw_geometries([boundary.to_legacy(), cloud.to_legacy()])