今天講講PCL點雲演算法庫對點雲如何「針對性」的濾波

所謂針對性,建立在非常明確你不想要的雜訊是什麼,纔能有的放矢。這一類的濾波器是我們很清楚的知道什麼是我們不想要的。最常用的就是離羣點的剔除。

1、直通濾波器 pcl::PassThrough 直接指定保留哪個軸上的範圍內的點

這個非常粗暴,劃分好 X , Y, Z 方向, 給定範圍值,就直接提出了不想要的點。慎用。

關鍵在於確定範圍,必須要知道自己不想要的範圍區間,在不知道的情況下也許還得先計算個包圍盒。

官方demo

我這裡的例子是直接砍掉了bunny的一半.

2、球半徑濾波器 去除離羣點 去除離散點 pcl::RadiusOutlierRemoval。

這個意思也很簡單,參數主要是半徑 d 的設定與候選點 n。原理是以點雲中的點為中心,確定一個半徑為d的球體。計算該球體內含有的點的數量,數量大於n時候,這個點被保留,反之就被剔除。

這是在我的數據下下離羣點剔除:由於半徑選區的不是那麼準確,可能一些原有的非離羣點也被濾掉了。

3、條件濾波器 pcl::ConditionalRemoval

顧名思義,滿足條件的點被保留,反之剔除。

2和3的官方demo是寫在一起的。代碼看官方的就好

我摘了一下核心的。

//創建條件定義對象
pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>());
//為條件定義對象添加比較運算元
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, 0.0)));
//添加在Z欄位上大於(pcl::ComparisonOps::GT great Then)0的比較運算元
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 0.8)));
//添加在Z欄位上小於(pcl::ComparisonOps::LT Lower Then)0.8的比較運算元

可以理解為是直通濾波器的加強版,但是我想應該還有別的條件約束實現濾波,比如曲率。具體看點雲文件中包含的信息,這個本質應該只是對點雲文件本身的一些數值比較操作而實現的過濾。

這裡我從x,y 方向各自切掉了bunny的一部分:

4、統計濾波器 pcl::StatisticalOutlierRemoval 去除明顯離羣點

官方demo

這個會稍微難理解一些。統計濾波器被用來剔除非常明顯的離羣點。這種點在空間中看去非常突出:「不合羣!」

其本質是通過點雲區域所反應的信息量來區分。點雲越聚集的地方信息量越大,反之,雜訊處越小。

於是定義如果某處點雲小於一定密度閾值。則視為無效。以每個點與其鄰近的 K 個點的平均距離作為密度度量。

理論上,點雲中所有點的密度應該滿足高斯分佈(其形狀是由均值和標準差決定)。於是密度在標準範圍以外的點,即可剔除。

下一篇中,我將介紹一些比較冷門的濾波器。


推薦閱讀:
相關文章