1. 程式人生 > >使用k-d樹進行無序點雲去噪

使用k-d樹進行無序點雲去噪

離散點雲的點之間是沒有拓撲結構的,因此為了找到它的幾何屬性,可以找到各點的鄰域結構。對於取樣點piP定義其鄰域Nkpi為取樣點pi的最近的k個取樣點組成的集合,即K-nearest neighbors。
那麼尋找K-nearest neighbours的方法主要由以下三種:
* 八叉樹法
* 空間網格法
* k-d樹法

一、八叉樹法

(1)首先確定資料點集最小包圍盒的邊長Lmin作為遞迴的終止條件;
(2)把點雲包圍盒平均分成8個小的包圍盒,對包含多個取樣點的包圍盒繼續分割,直到達到遞迴的終止條件,分割過程用八叉樹記錄;
(3)廣度遍歷八叉樹,利用資料點的空間分佈與包圍盒的空間關係,快速搜尋出任意取樣點P

的鄰域關係。

二、空間網格法

空間網格法也是基於對空間包圍盒的劃分,首先確定出包圍盒的大小{xmin,xmax,ymin,ymax,zmin,zmax},然後按照X,Y,Z方向上建立一系列的平行平面進行分割,這些平面把整個包圍盒劃分成多個小的包圍盒,取各個小包圍盒中最靠近該包圍盒中心的點作為代表,表示整個包圍盒中的資料。
這樣不僅確定了空間結構,而且可以精化點雲資料。

三、k-d樹法

1、k-d樹的構建過程

下面以構建二維空間的k-d樹為例,介紹一種k-d樹的生成的方法。
(1)首先按X軸的分割線對空間進行分割。計算所有點的x座標的平均值,選擇所有點中最接近平均值的點作為分割線,把空間中的點進行分割;
(2)對分隔好的空間按照y

軸的分割線進行分割,分割過程同上。分割好後繼續按x軸進行分割,依次類推,直到最終只剩每個空間中只有一個點結束分割。
這樣的分割過程就對應於一個二叉樹,每個分割線對應於一個分支,每個點對應於一個葉子節點。


這裡寫圖片描述

2、k-d樹的搜尋過程

假設這裡已經存在一棵已經建立好的二叉樹,如下圖所示:


這裡寫圖片描述

這是對一組二維點集{(2,3),(8,1),(9,6),(4,7),(7,2),(5,4)}建立起的二叉樹。
現在有一點(2,4.5),需要查詢它的最近鄰點,查詢方法如下所示。
(1)首先在建立好的k-d樹上進行遍歷,因為(2,4.5)的x座標比7小,因此進入(7,2)的左子樹,由因為(
2,4.5)
的縱座標比4大,因此進入(5,4)的右子樹,到達葉子節點(4,7);
(2)計算(2,4.5)(4,7)的距離為3.202,現在假定(4,7)為最近鄰點,進行回溯,計算(2,4.5)(5,4)的距離為3.041,則假定最近鄰點為(5,4);以(2,4.5)為圓心,以3.041為半徑畫一個圓,如下圖所示:
這裡寫圖片描述
可見該圓與(5,4)所在的分割線有交點,因此需要對(5,4)的左子樹進行遍歷,發現與(2,3)的距離為1.5。繼續回溯,而以(2,4.5)為圓心,以1.5為半徑畫圓,與(7,2)所在的分割線沒有交點,因此不需要對(7,2)的右子樹進行遍歷,如下圖所示:
這裡寫圖片描述
所以最終找的最近鄰點為(2,3),查詢結束。
這裡有一個部落格對k-d樹的建立與查詢講得很詳細,我的例子就是參考的它的,感謝。
http://www.cnblogs.com/eyeszjwang/articles/2429382.html

四、根據k-d樹進行無序點雲去噪

(1)根據點雲資料生成k-d樹,建立點雲的拓撲關係;
(2)查詢任一點的的鄰域;
(3)計算該點與鄰域內各點的距離取平均值;
(4)判斷該平均值是否超過閾值,若超過則判定該點為噪點,進行去除。