爲什麼進行點雲濾波處理:
(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)對數據進行下采樣