PCL—低層次視覺—點雲濾波(初步處理)


點雲濾波的概念

  點雲濾波是點雲處理的基本步驟,也是進行 high level 三維圖像處理之前必須要進行的預處理。其作用類似於信號處理中的濾波,但實現手段卻和信號處理不一樣。我認為原因有以下幾個方面:

  1. 點雲不是函數,對於復雜三維外形其x,y,z之間並非以某種規律或某種數值關系定義。所以點雲無法建立橫縱坐標之間的聯系。
  2. 點雲在空間中是離散的。和圖像,信號不一樣,並不定義在某個區域上,無法以某種模板的形式對其進行濾波。換言之,點雲沒有圖像與信號那么明顯的定義域。
  3. 點雲在空間中分布很廣泛。歷整個點雲中的每個點,並建立點與點之間相互位置關系成了最大難點。不像圖像與信號,可以有跡可循。
  4. 點雲濾波依賴於幾何信息,而不是數值關系。

  綜上所述,點雲濾波只在抽象意義上與信號,圖像濾波類似。因為濾波的功能都是突出需要的信息。

點雲濾波的方法

  PCL常規濾波手段均進行了很好的封裝。對點雲的濾波通過調用各個濾波器對象來完成。主要的濾波器有直通濾波器,體素格濾波器,統計濾波器,半徑濾波器 等。不同特性的濾波器構成了較為完整的點雲前處理族,並組合使用完成任務。實際上,濾波手段的選擇和采集方式是密不可分的。

  1. 如果使用線結構光掃描的方式采集點雲,必然物體沿z向分布較廣,但x,y向的分布處於有限范圍內。此時可使用直通濾波器,確定點雲在x或y方向上的范圍,可較快剪除離群點,達到第一步粗處理的目的。
  2. 如果使用高分辨率相機等設備對點雲進行采集,往往點雲會較為密集。過多的點雲數量會對后續分割工作帶來困難。體素格濾波器可以達到向下采樣同時不破壞點雲本身幾何結構的功能。點雲幾何結構不僅是宏觀的幾何外形,也包括其微觀的排列方式,比如橫向相似的尺寸,縱向相同的距離。隨機下采樣雖然效率比體素濾波器高,但會破壞點雲微觀結構。
  3. 統計濾波器用於去除明顯離群點(離群點往往由測量噪聲引入)。其特征是在空間中分布稀疏,可以理解為:每個點都表達一定信息量,某個區域點越密集則可能信息量越大。噪聲信息屬於無用信息,信息量較小。所以離群點表達的信息可以忽略不計。考慮到離群點的特征,則可以定義某處點雲小於某個密度,既點雲無效。計算每個點到其最近的k個點平均距離。則點雲中所有點的距離應構成高斯分布。給定均值與方差,可剔除3∑之外的點。
  4. 半徑濾波器與統計濾波器相比更加簡單粗暴。以某點為中心畫一個圓計算落在該圓中點的數量,當數量大於給定值時,則保留該點,數量小於給定值則剔除該點。此算法運行速度快,依序迭代留下的點一定是最密集的,但是圓的半徑和圓內點的數目都需要人工指定。

  實際上點雲濾波的手段和傳統的信號濾波與圖像濾波在自動化程度,濾波效果上還有很大的差距。學者大多關注圖像識別與配准算法在點雲處理方面的移植,而對濾波算法關注較少。其實點雲前處理對測量精度與識別速度都有很大影響。

 

點雲庫對濾波算法的實現

  點雲庫中已經包含了上述所有濾波算法。PCL濾波算法的實現是通過濾波器類來完成的,需要實現濾波功能時則新建一個濾波器對象並設置參數。從而保證可以針對不同的濾波任務,使用不同參數的濾波器對點雲進行處理。

  直通濾波器:

  // 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);

  顯然,不同的濾波器在濾波過程中,總是先創建一個對象,再設置對象參數,最后調用濾波函數對點雲進行處理(點雲為智能指針指向的一塊區域)

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM