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

2021-08-08 10:54:34 字數 2256 閱讀 9491

離散點雲的點之間是沒有拓撲結構的,因此為了找到它的幾何屬性,可以找到各點的鄰域結構。對於取樣點pi

∈p定義其鄰域nk

pi為取樣點pi

的最近的

k 個取樣點組成的集合,即k-nearest neighbors。 

那麼尋找k-nearest neighbours的方法主要由以下三種: 

* 八叉樹法 

* 空間網格法 

* k-d樹法

(1)首先確定資料點集最小包圍盒的邊長lm

in作為遞迴的終止條件; 

(2)把點雲包圍盒平均分成8個小的包圍盒,對包含多個取樣點的包圍盒繼續分割,直到達到遞迴的終止條件,分割過程用八叉樹記錄; 

(3)廣度遍歷八叉樹,利用資料點的空間分布與包圍盒的空間關係,快速搜尋出任意取樣點

p 的鄰域關係。

空間網格法也是基於對空間包圍盒的劃分,首先確定出包圍盒的大小

,然後按照x,

y,z 方向上建立一系列的平行平面進行分割,這些平面把整個包圍盒劃分成多個小的包圍盒,取各個小包圍盒中最靠近該包圍盒中心的點作為代表,表示整個包圍盒中的資料。 

這樣不僅確定了空間結構,而且可以精化點雲資料。

1、k-d樹的構建過程

下面以構建二維空間的k-d樹為例,介紹一種k-d樹的生成的方法。 

(1)首先按

x 軸的分割線對空間進行分割。計算所有點的

x 座標的平均值,選擇所有點中最接近平均值的點作為分割線,把空間中的點進行分割; 

(2)對分隔好的空間按照

y 軸的分割線進行分割,分割過程同上。分割好後繼續按

x 軸進行分割,依次類推,直到最終只剩每個空間中只有乙個點結束分割。 

這樣的分割過程就對應於乙個二叉樹,每個分割線對應於乙個分支,每個點對應於乙個葉子節點。 

2、k-d樹的搜尋過程

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

這是對一組二維點集

建立起的二叉樹。 

現在有一點 (

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樹的建立與查詢講得很詳細,我的例子就是參考的它的,感謝。 

(1)根據點雲資料生成k-d樹,建立點雲的拓撲關係; 

(2)查詢任一點的的鄰域; 

(3)計算該點與鄰域內各點的距離取平均值; 

(4)判斷該平均值是否超過閾值,若超過則判定該點為噪點,進行去除。

最鄰近點和kd樹詳解

1 什麼是kd樹 2 如何建立kd樹 用乙個簡單的例子,資料維度只有2維,所以可以簡單地給x,y兩個方向軸編號為0,1,也即split 1 確定split域的首先該取的值。分別計算x,y方向上資料的方差得知x方向上的方差最大,所以split域值首先取0,也就是x軸方向 2 確定node data的域...

KD樹 BBF KNN使用C 實現(2)

在上一節中我們講解了kd的構造過程,這裡我們主要講解的kd的搜尋過程,如何查詢距離目標點最近的點。我們先把kd樹的最鄰近搜尋 knn 的 貼上出來 private node kdtreefindnearest node tree,train target else searchnode search...

kd樹劃分空間選擇維度使用方差的好處

最近學習 統計學習方法 裡的kd樹時,雖然演算法的原理比較清晰,但是一直感覺選擇維度的時候使用j i mod k 1的輪替模式會導致空間分的太不均衡,可能導致搜尋kd樹的某些時候效率偏低。在知乎上看到 使用方差來選擇維度,使用中值來作為結點取值,感覺這種做法可能能更好的劃分每個結點的左右子樹所代表的...