離散點雲的點之間是沒有拓撲結構的,因此為了找到它的幾何屬性,可以找到各點的鄰域結構。對於取樣點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樹的某些時候效率偏低。在知乎上看到 使用方差來選擇維度,使用中值來作為結點取值,感覺這種做法可能能更好的劃分每個結點的左右子樹所代表的...