在點(diǎn)云處理中,過密的點(diǎn)云需要下采樣,離群點(diǎn)和噪聲點(diǎn)需要去除,通過濾波的方法,可以抽稀點(diǎn)云,把離群點(diǎn)去除,以便進(jìn)行下一步處理
open3d中,很多濾波器已經(jīng)被封裝成了對應(yīng)的方法(源碼是C++)
1.直通濾波
直通濾波過濾指定維度(x,y,z)內(nèi),指定值域外的點(diǎn)
# 定義直通濾波函數(shù)
def pass_through(cloud, limit_min=0, limit_max=10, filter_value_name="z"):
points = np.asarray(cloud.points)
if filter_value_name == "x":
ind = np.where((points[:, 0] >= limit_min) & (points[:, 0] <= limit_max))[0]
x_cloud = pcd.select_by_index(ind)
return x_cloud
elif filter_value_name == "y":
ind = np.where((points[:, 1] >= limit_min) & (points[:, 1] <= limit_max))[0]
y_cloud = cloud.select_by_index(ind)
return y_cloud
elif filter_value_name == "z":
ind = np.where((points[:, 2] >= limit_min) & (points[:, 2] <= limit_max))[0]
z_cloud = pcd.select_by_index(ind)
return z_cloud
pcd = o3d.io.read_point_cloud("./data/test.ply")
filtered_cloud = pass_through(pcd,limit_min=0,limit_max=50,
filter_value_name="y")
2.體素下采樣
下采樣
首先根據(jù)輸入點(diǎn)云,計算一個正好包裹點(diǎn)云的長方體,然后根據(jù)給定的體素分辨率分割成小正方體(體素),最后用非空體素的質(zhì)心或者中心坐標(biāo)代替原來的點(diǎn)
調(diào)用o3d函數(shù),參數(shù)只有一個:給定的體素分辨率
pcd = o3d.io.read_point_cloud("./data/test.ply")
pcd.voxel_down_sample(voxel_size = 0.05)
3.均勻下采樣
也是下采樣
通過構(gòu)建球體,選擇距離球心最近的點(diǎn)采樣,比起體素下采樣,均勻下采樣不移動點(diǎn)本身的位置
調(diào)用o3d函數(shù),參數(shù)只有一個:每k個點(diǎn)保留一個點(diǎn)
pcd = o3d.io.read_point_cloud("./data/test.ply")
pcd =pcd.uniform_down_sample(every_k_points = 3)
4.統(tǒng)計濾波
去除分布稀疏的點(diǎn)
對于點(diǎn)云中的每個點(diǎn),計算到最近k個點(diǎn)的平均距離,然后假設(shè)結(jié)果構(gòu)成高斯分布,過濾平均距離大于標(biāo)準(zhǔn)差的點(diǎn)
調(diào)用o3d函數(shù),參數(shù)有兩個:文章來源地址http://www.zghlxwxcb.cn/news/detail-464049.html
# nb_neighbors:最近k個點(diǎn) std_ratio:基于標(biāo)準(zhǔn)差的閾值,越小濾除點(diǎn)越多
cl,ind = pcd.remove_statistical_outlier(nb_neighbors=5,std_ratio=1)
pcd = pcd.select_by_index(ind)
5.半徑濾波
也是去除分布稀疏的點(diǎn)
以每個點(diǎn)為中心建立給定半徑的球體,移除球體中點(diǎn)的數(shù)量小于給定閾值的點(diǎn)文章來源:http://www.zghlxwxcb.cn/news/detail-464049.html
調(diào)用o3d函數(shù),參數(shù)有兩個:
# nb_points:基于球體內(nèi)包含點(diǎn)數(shù)量的閾值 radius:半徑
cl,ind = pcd.remove_radius_outlier(nb_points,radios=1)
pcd = pcd.select_by_index(ind)
到了這里,關(guān)于Open3D常用點(diǎn)云濾波的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!