hello,小伙伴们,今天我们来聊一聊三维模型特征提取。在我们日常对模型进行一些操作(例如,配准、寻找特定点等),我们总是会遇到一个问题,就是如何从三维模型中提取其特征点。解决这个问题的方法有很多,例如,下采样,iss,甚至是深度学习等方法。
今天,我会教大家几种基础的方法来进行特征点的提取。
先清楚咱们今天的主角——示例的点云模型吧。大家可以猜猜这是什么,嘿嘿~
图1 示例点云模型
首先是超级经典的ISS算法。
ISS(Intrinsic Shape Signatures)算法是一种用于点云数据的特征提取方法,旨在描述点云中的局部形状信息。其核心思想是通过对点云中的每个点进行评估,为每个点分配一个局部形状签名。这个局部形状签名可以被用来比较点的局部形状,从而识别点云中的特定结构或特征。
import open3d as o3d
# 读取PLY文件
pcd = o3d.io.read_point_cloud("./fengxing_out/316ply/fx_0_l_gg_modify.ply")
# iss
keypoints = o3d.geometry.keypoint.compute_iss_keypoints(pcd)
# 设置特征点的颜色
keypoints.paint_uniform_color([1.0, 0.75, 0.0])
# 可视化点云
o3d.visualization.draw_geometries([keypoints])
图2是ISS的结果。我的这个示例模型是一个真实人骨的三维模型,表面凹凸不平,因此ISS在对这样的模型提取特征时效果并不会很好,但ISS在针对三维城市模型提取特征时效果会更好。
图2 ISS算法结果
接下来呢,是介绍另一类提取特征的方法——点云下采样。这里我会介绍几种常用的点云下采样方法。
首先是均匀下采样。图3是均匀下采样的结果。
import open3d as o3d
#点云下采样-均匀下采样
pcd = o3d.io.read_point_cloud("./fengxing_out/316ply/fx_0_l_gg_modify.ply")
pcd_new = o3d.geometry.PointCloud.uniform_down_sample(pcd, 1000)#pcd为点云模型文件,1000为参数,可以按照自己的需求修改参数
o3d.visualization.draw_geometries([pcd_new])
图3 均匀下采样结果
其次是体素下采样,图4是体素下采样的结果。
import open3d as o3d
#点云下采样-体素下采样
pcd = o3d.io.read_point_cloud("./fengxing_out/316ply/fx_0_l_gg_modify.ply")
pcd_new = o3d.geometry.PointCloud.voxel_down_sample(pcd, 20)#pcd为点云模型文件,1000为参数,可以按照自己的需求修改参数
o3d.visualization.draw_geometries([pcd_new])
图4 体素下采样结果
然后是曲面均匀采样,图5是曲面均匀采样的结果。
import open3d as o3d
#点云下采样-曲面均匀采样
ply = o3d.io.read_triangle_mesh("./fengxing_out/316ply/fx_0_l_gg_modify.ply")
pcd = ply.sample_points_uniformly(number_of_points=1000)#1000为参数,可以按照自己的需求修改参数
o3d.visualization.draw_geometries([pcd])
图5 曲面均匀采样
最后是泊松磁盘采样,图6是泊松磁盘采样的结果。
import open3d as o3d
#点云下采样-泊松磁盘采样
ply = o3d.io.read_triangle_mesh("./fengxing_out/316ply/fx_0_l_gg_modify.ply")
pcd = ply.sample_points_poisson_disk(number_of_points=50)#50为参数,可以按照自己的需求修改参数
o3d.visualization.draw_geometries([pcd])
图6 泊松磁盘采样结果
希望能帮助到各位小伙伴哦~大家可以根据自己的需求进行选择。如果大家对三维模型重建或者医学图像处理感兴趣的话,欢迎大家看看我的其他博客和资源哦~Python-医学图像处理之三维重建(进行切片级重建)_python医学图像处理_Cherry330的博客-CSDN博客