點雲濾波(1)

噪聲點與離羣點。在獲取點雲數據時,由於設備精度、操作者經驗、環境因素等帶來的影響,以及電磁波衍射特性、被測物體表面性質變化和數據拼接配準操作過程的影響,點雲數據中將不可避免地出現一些噪聲點,屬於隨機誤差。除此之外,由於受到外界干擾如視線遮擋,障礙物等因素的影響,點雲數據中往往存在着一些距離主題點雲較遠的離散點,即離羣點。

**點雲處理中濾波目的。**濾波處理作爲點雲處理的第一步,對後續處理有很重要。只有在濾波處理流程中將噪聲點、離羣點、空洞、數據壓縮等按照後續處理定製,才能更好地進行配準、特徵提取、曲面重建、可視化等後續應用處理。點雲數據集中每一個點表達一定的信息量,某個區域點越密集有用的信息量越大。孤立的離羣點信息量較小,其表達的信息量可以忽略不計。

(1)直通濾波器

對於在空間分佈有一定空間特徵的點雲數據,比如使用線結構光掃描的方式採集點雲,沿z向分佈較廣,但x,y向的分佈處於有限範圍內。此時可使用直通濾波器,確定點雲在x或y方向上的範圍,可較快剪除離羣點,達到第一步粗處理的目的。

(2)體素濾波器

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

(3)統計濾波器

考慮到離羣點的特徵,則可以定義某處點雲小於某個密度,既點雲無效。計算每個點到其最近的k個點平均距離。則點雲中所有點的距離應構成高斯分佈。給定均值與方差,可剔除3∑之外的點。

(4)條件濾波

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

(5)半徑濾波器

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

(6)雙邊濾波

雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結合圖像的空間鄰近度和像素值相似度的一種折中處理,同時考慮空域信息和灰度相似性,達到保邊去噪的目的。具有簡單、非迭代、局部的特點 。雙邊濾波器的好處是可以做邊緣保存。先簡要介紹圖像的雙邊濾波:

該算法是針對圖像的空間域(spatial domain)和像素範圍域(range domain),所以在設計的時候就會有兩個權重,Ws和Wr,那麼公式就可以簡單的理解爲:

在這裏插入圖片描述
p爲當前點,之所以是向量,因爲有時候圖像不只是灰度圖像,也有三色圖像,所以用向量表示p的多維空間,I則爲圖像,Ip就是表示圖像I的p點,S爲p的鄰域集,q是鄰域中的一個點,BF則爲輸出的圖像。

σs和σc分別爲空域濾波權值函數的標準差和像素相關性權值函數的標準差。

 雙邊濾波的權重是ws和wr的乘積。對於ws來說,這就是普通的高斯濾波函數,其代入的座標,sigmas是程序輸入值,該函數是在空間臨近度上計算的。而wr是計算像素值相似度(顏色空間)。

當圖像在變化程度平緩的區域時,鄰域中的像素值(RGB值)差距相差不大。此時wr無限接近於1,因此此時的雙邊就是普通的高斯濾波,達到對圖像平滑的效果,如左圖。

當圖像在變化程度劇烈的區域,比如在邊緣區域時,鄰域中的像素值(RGB值)差距相差很大。此時wr朝0值趨近,顏色差值越大,wr越逼近0,最終整個式子的值逼近於0。最終的結果是權值爲0。因此在最終計算時,該處將不影響輸出值,如右圖。

對於雙邊濾波不只用在圖像,很多時候也會在處理點雲數據的時候使用,對點雲數據進行光滑處理。雙邊濾波算法主要用於對點雲數據的小尺度起伏噪聲進行平滑光順。雙邊濾波應用於三維點雲數據去噪,既有效地對空間三維模型表面進行降噪,又可以保持點雲數據中的幾何特徵信息,避免三維點雲數據被過渡光滑。在點雲模型中設點p的k鄰域點集及單位法向量分別爲與 ,雙邊濾波可以定義爲:
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

WC,WS 分別表示雙邊濾波函數的空間域和頻率域權重函數,它們分別控制着雙邊濾波的平滑程度和特徵保持程度。<n,pj-pi>爲n與pj-pi的內積,, 爲點 的法向量。

在這裏插入圖片描述

 pcl::PointCloud<pcl::PointXYZ>::Ptr xyz (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::FastBilateralFilter<pcl::PointXYZ> fbf;
  fbf.setInputCloud (xyz);
  fbf.setSigmaS (sigma_s);//設置雙邊濾波器用於空間鄰域/窗口的高斯的標準偏差
 
  fbf.setSigmaR (sigma_r);//設置高斯的標準偏差用於控制相鄰像素由於強度差異而下降多少(在我們的情況下爲深度)
  pcl::PointCloud<pcl::PointXYZ> xyz_filtered;
  fbf.filter (xyz_filtered);

注意:能使用雙邊濾波的點雲必須得包含強度字段。現有的points類型中,只有PointXYZI和PointXYZINormal有強度信息。FastBilateralFilter只適用於有序點雲。

from:https://mp.weixin.qq.com/s/9pxff6LwcecDHsx4kI34sw

7、基於點雲頻率的濾波方法點雲的頻率:

點雲和圖像一樣,有可能也存在頻率的概念。點雲表達的是三維空間中的一種信息,這種信息本身並沒有一一對應的函數值。故點雲本身並沒有在講訴一種變化的信號。但點雲存在某種空間關係。我們可以人爲的指定點雲空間中的一個點,基於此點來討論點雲在各個方向上所謂的頻率。

在傳統的信號處理中,高頻信號一般指信號變化快,低頻信號一般指信號變化緩慢。在圖像處理中,高低頻的概念被引申至不同方向上圖像灰度的變化,傅里葉變換可以用於提取圖像的週期成分濾除布紋噪聲。在點雲處理中,定義:點雲法線向量差爲點雲所表達的信號。換言之,如果某處點雲曲率大,則點雲表達的是一個變化的信號。如果點雲曲率小,則其表達的是一個不變的信號。這和我們的直觀感受也是相近的,地面曲率小,它表達的信息量也小;人的五官部分曲率大,其表達了整個Scan中最大的信息量。

DoN算法

點雲頻率的思想已經被廣泛的應用在了各個方面,最著名的莫過於DoN算法。DoN算法被作者歸類於點雲分割算法中,本質上DoN只是一種前處理,應該算是一種比較先進的點雲濾波算法。分割本質上還是由歐式分割算法完成的。DoN 是 Difference of Normal 的簡寫。算法的目的是在去除點雲低頻濾波,低頻信息(例如建築物牆面,地面)往往會對分割產生干擾,高頻信息(例如建築物窗框,路面障礙錐)往往尺度上很小,直接採用 基於臨近信息 的濾波器會將此類信息合併至牆面或路面中。所以DoN算法利用了多尺度空間的思想,算法如下:

在小尺度上計算點雲法線1
在大尺度上計算點雲法線2
法線1-法線2
濾去3中值較小的點
根據第三步得到的法線差,進行歐式分割
  顯然,在小尺度上是可以對高頻信息進行檢測的,此算法可以很好的小尺度高頻信息。其在大規模點雲(如LiDar點雲)中優勢尤其明顯。

pcl對該算法的實現方法:
算法的運行過程可用圖表示爲:
在這裏插入圖片描述

// Create a search tree, use KDTreee for non-organized data.
  pcl::search::Search<PointXYZRGB>::Ptr tree;
  if (cloud->isOrganized ())
  {
    tree.reset (new pcl::search::OrganizedNeighbor<PointXYZRGB> ());
  }
  else
  {
    tree.reset (new pcl::search::KdTree<PointXYZRGB> (false));
  }
  // Set the input pointcloud for the search tree
  tree->setInputCloud (cloud);

  //生成法線估計器(OMP是並行計算,忽略)
  pcl::NormalEstimationOMP<PointXYZRGB, PointNormal> ne;
  ne.setInputCloud (cloud);
  ne.setSearchMethod (tree);
  //設定法線方向(要做差,同向很重要)
    ne.setViewPoint (std::numeric_limits<float>::max (),    std::numeric_limits<float>::max (), std::numeric_limits<float>::max ());

  //計算小尺度法線
  pcl::PointCloud<PointNormal>::Ptr normals_large_scale (new pcl::PointCloud<PointNormal>);
  ne.setRadiusSearch (scale2);
  ne.compute (*normals_large_scale);
  //計算大尺度法線
  pcl::PointCloud<PointNormal>::Ptr normals_large_scale (new pcl::PointCloud<PointNormal>);
  ne.setRadiusSearch (scale2);
  ne.compute (*normals_large_scale);

  //生成DoN分割器
  pcl::DifferenceOfNormalsEstimation<PointXYZRGB, PointNormal, PointNormal> don;
  don.setInputCloud (cloud);
  don.setNormalScaleLarge (normals_large_scale);
  don.setNormalScaleSmall (normals_small_scale);

  //計算法線差
  PointCloud<PointNormal>::Ptr doncloud (new pcl::PointCloud<PointNormal>);
  copyPointCloud<PointXYZRGB, PointNormal>(*cloud, *doncloud);
  don.computeFeature (*doncloud);

  //生成濾波條件:把法線差和閾值比
    pcl::ConditionOr<PointNormal>::Ptr range_cond (
    new pcl::ConditionOr<PointNormal> ()
    );
  range_cond->addComparison (pcl::FieldComparison<PointNormal>::ConstPtr (
                               new pcl::FieldComparison<PointNormal> ("curvature", pcl::ComparisonOps::GT, threshold))
                             );
  //生成條件濾波器,輸入濾波條件和點雲
  pcl::ConditionalRemoval<PointNormal> condrem (range_cond);
  condrem.setInputCloud (doncloud);

  //導出濾波結果
  pcl::PointCloud<PointNormal>::Ptr doncloud_filtered (new pcl::PointCloud<PointNormal>);
  condrem.filter (*doncloud_filtered);

  //歐式聚類~~~(略)

PCL實現參見博客:https://www.cnblogs.com/ironstark/p/5010771.html
————————————————
版權聲明:本文爲CSDN博主「菜鳥知識搬運工」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_30815237/article/details/86294496

發佈了35 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章