轉載自:https://blog.csdn.net/weixin_46098577/article/details/114385690
PCL中點雲濾波模塊提供了很多靈活實用的濾波處理算法,例如:直通濾波、統計濾波、雙邊濾波、高斯濾波、基於隨機采樣一致性濾波等。同時,PCL中總結了幾種需要進行點雲濾波處理的情況,如下:
點雲數據密度不規則需要平滑
因遮擋等問題噪聲的離群點需要去除
數據冗余需要下采樣
噪聲數據需要去除
對應的方法如下:
按具體給定的規則過濾點
通過濾波算法修改點的部分屬性
點雲數據下采樣
下面對PCL各種濾波方法做一些歸納總結,方便日后使用。
一、直通濾波
針對點雲某一維度,去掉指定范圍內(或外)的點。
流程:讀入點雲→創建濾波器對象→設置濾波字段范圍→執行濾波→保存濾波結果
#include <pcl/filters/passthrough.h>

二、VoxelGrid體素濾波器
對點雲數據創建一個三維體素柵格(微小的空間三維立方體的集合),用每個體素重心近似代替體素中的其他點。這種方法比用體素中心來逼近的方法更慢,但它對於采樣點對應曲面的表示更為准確。
流程:讀入點雲→創建濾波器對象→設置體素大小→執行濾波→保存濾波點雲
#include <pcl/filters/voxel_grid.h
濾波前后對比

三、UniformSampling均勻采樣
對點雲數據創建一個三維體素柵格,然后,在每個體素保留一個最接近體素中心的點,代替體素中所有點。
流程:讀入點雲→創建濾波器對象→設置濾波球體半徑→執行濾波→保存濾波點雲
#include <pcl/keypoints/uniform_sampling.h>
濾波前后對比

四、StatisticalOutlierRemoval統計濾波器
對每一點的鄰域進行統計分析,基於點到所有鄰近點的距離分布特征,過濾掉一些不滿足要求的離群點。該算法對整個輸入進行兩次迭代:在第一次迭代中,它將計算每個點到最近k個近鄰點的平均距離,得到的結果符合高斯分布。接下來,計算所有這些距離的平均值 μ 和標准差 σ 以確定距離閾值 thresh_d ,且 thresh_d = μ ± k·σ。 k為標准差乘數。在下一次迭代中,如果這些點的平均鄰域距離分別低於或高於該閾值,則這些點將被分類為內點或離群點。
流程:讀入點雲→創建濾波器對象→設置離群點閾值→執行統計濾波→保存濾波點雲
#include <pcl/filters/statistical_outlier_removal.h>
濾波前后對比

五、RadiusOutlierRemoval半徑濾波器
對整個輸入迭代一次,對於每個點進行半徑R鄰域搜索,如果鄰域點的個數低於某一閾值,則該點將被視為噪聲點並被移除。
流程:讀入點雲→創建半徑濾波器對象→設置離群點閾值→執行下采樣→保存采樣結果
#include <pcl/filters/radius_outlier_removal.h>
濾波前后對比

六、ConditionRemoval條件濾波器
篩選滿足特定條件的點雲數據。有兩種類型的條件:
ConditionAnd: 所有條件都要滿足
ConditionOr: 滿足一個條件即可
可以設置一個或多個條件對象,並為條件對象添加比較算子。條件比較算子包含三項:
(1)名稱:對應於點雲XYZ字段名稱、RGB顏色空間、HSI顏色空間中的顏色分量等。
(2) 比較運算符:GT、GE、LT、LE、EQ
運算符 含義
GT greater than 大於
GE greater than or equal 大於等於
LT less than 小於
LE less than or equal 小於等於
EQ equal 等於
比較運算符源碼
switch (this->op_) { case pcl::ComparisonOps::GT : return (compare_result > 0); case pcl::ComparisonOps::GE : return (compare_result >= 0); case pcl::ComparisonOps::LT : return (compare_result < 0); case pcl::ComparisonOps::LE : return (compare_result <= 0); case pcl::ComparisonOps::EQ : return (compare_result == 0); default: PCL_WARN ("[pcl::FieldComparison::evaluate] unrecognized op_!\n"); return (false); }
值:即要比較的名稱的數值
流程:讀入點雲→創建條件對象→添加比較算子→創建條件限定下的濾波器對象→執行濾波→保存濾波結果
#include <pcl/filters/conditional_removal.h>
濾波前后對比

setKeepOrganized(true) 解釋:
保持點雲結構,即有序點雲經過濾波后,仍能夠保持有序性。
setKeepOrganized默認false,即直接將濾除的點刪除,從而可能改變點雲的組織結構。is_dense: 1
若設置為true,再通過setuserFilterValue設置一個指定的值,被濾除的點將會被該值代替;不進行setuserFilterValue設置,則默認用nan填充被濾除的點。is_dense: 0;
七、ExtractIndices索引提取
從原始點雲中提取一組索引對應的點雲子集,前提是要獲取點雲索引集合。
流程:讀入點雲→平面分割獲取索引集合→創建點雲索引提取對象→執行索引提取→保存提取點雲
#include <pcl/filters/extract_indices.h>
濾波前后對比

八、投影濾波器
將點投影到一個參數化模型上,這個參數化模型可以是平面、圓球、圓柱、錐形等進行投影濾波。
參數化模型投影點雲,以平面投影為例:讀入點雲→創建參數化模型→設置模型系數→執行投影濾波→保存投影點雲
#include <pcl/filters/project_inliers.h>
投影前后對比

九、ModelOutlierRemoval模型濾波器
根據點到模型的距離,設置距離閾值過濾非模型點
流程:讀入點雲→設置模型系數→創建模型濾波器對象→執行模型濾波→保存濾波結果
濾波前后對比

十、空間裁剪濾波
10.1 CropHull濾波器
獲取點雲在 3D 封閉曲面上或 2D 封閉多邊形內或外部的點。
流程:讀入點雲→設置封閉范圍頂點→創建凸包對象→執行CropHull濾波→保存濾波點雲

需要注意的是 ,setDimension()和CH.setDim()的維度應保持一致
當維度設置為2時,封閉區域為2D封閉多邊形,只有X和Y兩個維度。因此,該封閉多邊形在三維空間中表示為垂直於XOY面的豎直曲面。得到的是曲面內部或外部的點雲。
當維度設置為3時,封閉區域為3D封閉曲面,僅得到位於該封閉曲面上的點。
十一 、BilateralFilter 雙邊濾波器
class pcl::BilateralFilter< PointT > 類BilateralFilter是對雙邊濾波算法在點雲上的實現,該類的實現利用的並非XYZ字段的數據進行,而是利用強度數據進行雙邊濾波算法的實現,所以在使用該類時點雲的類型必須有強度字段,否則無法進行雙邊濾波處理(所以在用這個函數的時候是需要注意自己輸入點雲的數據格式的,需要包含點雲的強度信息)
#include <pcl/filters/bilateral.h>
注:只是代碼跑通,並不適用於1.pcd文件(1.pcd文件只有XYZ字段,沒有強度字段)
