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