【圖像處理】PCL點雲數據的濾波降噪的方法

爲什麼進行點雲濾波處理:
(1) 點雲數據密度不規則需要平滑;
(2) 因爲遮擋等問題造成離羣點需要去除;
(3) 大量數據需要下采樣;
(4) 噪聲數據需要去除;

點雲數據去噪濾波方法:
雙邊濾波、高斯濾波、分箱去噪、KD-Tree、直通濾波、隨機採樣一致性濾波等;

方法定義以及適用性:
1.雙邊濾波:將距離和空間結構結合去噪,效果較好。只適用於有序點雲

2.高斯濾波(標準差去噪):適用於呈正態分佈的數據。考慮到離羣點的特徵,則可以定義某處點雲小於某個密度,既點雲無效。計算每個點到其最近的k個點平均距離。則點雲中所有點的距離應構成高斯分佈。給定均值與方差,可剔除3∑之外的點。

3.分箱去噪:適用於呈偏態分佈的數據。

4.dbscan:基於聚類原理去噪,複雜度較高。

5.KD-Tree(孤立森林):複雜度高。構建KD樹,隨機取點求平均距離d,刪掉所有大於2d的點。適用於無序點雲去噪。

6.條件濾波:條件濾波器通過設定濾波條件進行濾波,有點分段函數的味道,當點雲在一定範圍則留下,不在則捨棄。

7.直通濾波

8.隨機採樣一致性濾波

9.體素濾波:
體素的概念類似於像素,使用AABB包圍盒將點雲數據體素化,一般體素越密集的地方信息越多,噪音點及離羣點可通過體素網格去除。另一方面如果使用高分辨率相機等設備對點雲進行採集,往往點雲會較爲密集。過多的點雲數量會對後續分割工作帶來困難。體素濾波器可以達到向下採樣同時不破壞點雲本身幾何結構的功能。

10.半徑濾波:
半徑濾波器與統計濾波器相比更加簡單粗暴。以某點爲中心畫一個圓計算落在該圓中點的數量,當數量大於給定值時,則保留該點,數量小於給定值則剔除該點。此算法運行速度快,依序迭代留下的點一定是最密集的,但是圓的半徑和圓內點的數目都需要人工指定。

原理以及核心代碼:

直通濾波器:對於在空間分佈有一定空間特徵的點雲數據,比如使用線結構光掃描的方式採集點雲,沿z向分佈較廣,但x,y向的分佈處於有限範圍內。此時可使用直通濾波器,確定點雲在x或y方向上的範圍,可較快剪除離羣點,達到第一步粗處理的目的。
// Create the filtering object  
pcl::PassThrough<pcl::PointXYZ> pass;  
pass.setInputCloud (cloud);  
pass.setFilterFieldName ("z");  
pass.setFilterLimits (0.0, 1.0);  
//pass.setFilterLimitsNegative (true);  
pass.filter (*cloud_filtered);  

體素濾波器:
 // Create the filtering object
  pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
  sor.setInputCloud (cloud);
  sor.setLeafSize (0.01f, 0.01f, 0.01f);
  sor.filter (*cloud_filtered);


統計濾波器:
 // Create the filtering object
  pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
  sor.setInputCloud (cloud);
  sor.setMeanK (50);
  sor.setStddevMulThresh (1.0);
  sor.filter (*cloud_filtered);

半徑濾波器:
  // build the filter
    pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
    outrem.setInputCloud(cloud);
    outrem.setRadiusSearch(0.8);
    outrem.setMinNeighborsInRadius (2);
    // apply filter
    outrem.filter (*cloud_filtered);

一般來說,濾波對應的方案有如下幾種:

(1)按照給定的規則限制過濾去除點
(2)通過常用濾波算法修改點的部分屬性
(3)對數據進行下采樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章