点云离群点剔除 — open3d python
????????離群點一般是指偏離大部分數據的點,可能是由于隨機誤差造成異常點。離群點剔除的方法有很多種,例如基于統計、鄰近度、密度、方差等方法。這里主要介紹open3d中實現的三種點云離群點的剔除方法,包括無效值剔除、統計方法、半徑濾波法。
1 無效值剔除
????????無效值包括空值和無限值。空值一般用NaN表示。open3d中對應的剔除函數為remove_non_finite_points。當remove_nan為True時,剔除空值。當remove_infinite為True時表示去除無限值。
remove_non_finite_points(self, remove_nan=True, remove_infinite=True)2 統計方式剔除
????????open3d中基于統計的方式剔除點云中離群點的函數是remove_statistical_outlier。該函數含有三個參數。第一個參數nb_neighbors是目標點的相鄰點個數。std_ratio是標準差。該離群點剔除方法是指。在一個點周圍選擇若干個點,計算它們距離的統計參數,如果某個點偏離平均值超過stdio_ratio倍的方差則認為是離群點,并進行刪除。std_ratio實際上是指偏離標準差的倍數。因此,這種方法也可以稱為鄰域濾波。第三個參數print_progress為True時,可以顯示處理進度。
remove_statistical_outlier(nb_neighbors,std_ratio,print_progress = False) 參數 nb_neighbors ( int ) -- 目標點周圍的鄰居數。 std_ratio ( float ) – 標準偏差比率。 print_progress ( bool , optional , default=False ) – 設置為 True 以打印進度條。3 半徑濾波方式剔除
? ? ? ? 半徑濾波離群點剔除是在指在目標點周圍指定半徑內統計點的數量,如果點的數量小于某一閾值則認為目標點是離群點并進行刪除。因此,半徑濾波剔除離群點方法的兩個主要參數就是半徑和點云數量閾值。
remove_radius_outlier(自我,nb_points,半徑,print_progress = False) 刪除給定半徑的給定球體中小于 nb_points 的點的函數 參數 nb_points ( int ) – 半徑內的點數。 radius ( float ) -- 球體的半徑。 print_progress ( bool , optional , default=False ) – 設置為 True 以打印進度條。?4?python open3d 離群點剔除?
? ? ? ? pcd文件請參考:pcd格式點云樣例文件-深度學習文檔類資源-CSDN下載。
# -*- coding: utf-8 -*- """ 樂樂感知學堂公眾號 @author: https://blog.csdn.net/suiyingy """import open3d as o3d from copy import deepcopy import numpy as npif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd = pcd.uniform_down_sample(50)#每50個點采樣一次pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定顯示為灰色print(pcd)#剔除無效值pcd1 = deepcopy(pcd)pcd1.paint_uniform_color([0, 0, 1])#指定顯示為藍色pcd1.translate((20, 0, 0)) #整體進行x軸方向平移pcd1 = pcd1.remove_non_finite_points(True, True)#剔除無效值print(pcd1)#統計方法剔除pcd2 = deepcopy(pcd)pcd2.paint_uniform_color([0, 1, 0])#指定顯示為藍色pcd2.translate((-20, 0, 0)) #整體進行x軸方向平移res = pcd2.remove_statistical_outlier(20, 0.5)#統計方法剔除pcd2 = res[0]#返回點云,和點云索引print(pcd2)#半徑方法剔除pcd3 = deepcopy(pcd)pcd3.paint_uniform_color([1, 0, 0])#指定顯示為藍色pcd3.translate((0, 20, 0)) #整體進行y軸方向平移res = pcd3.remove_radius_outlier(nb_points=20, radius=2)#半徑方法剔除pcd3 = res[0]#返回點云,和點云索引print(pcd3)# # 點云顯示o3d.visualization.draw_geometries([pcd, pcd1, pcd2, pcd3], #點云列表window_name="離群點剔除",point_show_normal=False,width=800, # 窗口寬度height=600) # 窗口高度5 點云剔除效果
? ? ? ? 灰色圖片為原始點云,藍色為open3d無效值剔除后結果,綠色為open3d為統計方法剔除結果,紅色為半徑濾波方法剔除結果。
python三維點云從基礎到深度學習_Coding的葉子的博客-CSDN博客_3d點云 python從三維基礎知識到深度學習,將按照以下目錄持續進行更新。https://blog.csdn.net/suiyingy/article/details/124017716
?更多三維、二維感知算法和金融量化分析算法請關注“樂樂感知學堂”微信公眾號,并將持續進行更新。
總結
以上是生活随笔為你收集整理的点云离群点剔除 — open3d python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习分享——基于深度学习的NILM负荷分
- 下一篇: Wireshark配置显示IP地理位置信