SIFT的一些細節問題(三)

2021-05-23 18:21:43 字數 1315 閱讀 9267

其實以下問題不一定要歸結到sift的內容當中來,因為這是關於特徵點匹配方面的,只是由於我是在看sift的時候接觸到這些,並且也只是有一點粗淺的了解,將一些基礎的總結性的知識儲備在這裡吧。不能算問題,只能是知識點。

2、kd-樹建立。簡單地說,kd-樹是將n維特徵向量按照一定的規則在某一維中劃一條「直線」,將資料分為左右兩個子空間,然後再迭代地進行此過程(個人認為其思想可可能**於二叉樹,o(∩_∩)o)。具體分為以下幾個步驟(非形式化描述):

(1)確定split域。對所有資料點的各個維度上的資料求方差,選擇方差最大的軸(維)作為split域(即要在這個軸上「開刀」、「畫直線」)。

(2)確定node-data。根據前面所確定的那一維,取所有資料點在這一維上的中值(上取整),作為要分割的資料點,即畫一條通過此點並分割此軸的「直線」。

(3)將資料分為左右兩個子空間,並將此node-data作為其父節點。

(4)重複上述過程直到資料劃分完畢。

至此kd-樹建立好了,kd-樹有以下幾個優點:(1)比較容易刻畫資料的聚簇性質;(2)其切分空間的區域性解析度可以調整;(3)切割面的法向可以調整。

3、最近鄰查詢演算法。kd-樹已經建立,怎樣尋找乙個資料點在kd-樹種的最近鄰點呢?簡單地說(好像還不是很容易一兩句話就說清楚),將資料點按照二叉樹樹的結構依次找,找到「最近點」(此時表示在樹中最近,但是距離並不一定是最近),然後進行回溯,需要將查詢路徑回溯完畢,則可以找出最近距離的點。無疑這裡的回溯過程是影響匹配效率的瓶頸。於是就有了對之所做的改進演算法——bbf(best-bin-first)查詢機制,即在回溯時按照優先順序進行回溯,通過建立優先佇列,可以在任何時候中斷退出查詢過程,並且總能得到比較好的結果,以精度換時間。另外還有一種改進,就是spill-樹,這種樹的不同之處在於在每條「直線」兩邊有乙個「子帶」,如果資料落入了這個子帶之內,則認為已經很接近,不需要再回溯其他節點(具體過程我就沒有關注了)。

4、匹配對提純。匹配好的匹配對並非完全正確,這時需要將匹配錯誤的剔除。

(1)比值提純法。就是利用最近鄰與次近鄰的比值作為閾值進行判斷,lowe的sift就採用這種方法,簡單。

(2)一致性提純法。為了消除錯誤資料的影響,通常有最小中值法(least median of squares,lms),m估計法,mlesac演算法,ransac演算法。其中ransac演算法實現簡單,效能良好,經常被採用。簡單地說,隨機抽樣一致性ransac(random sample consensus)的主要思路是通過取樣和驗證的策略,求解大部分樣本都能滿足的數學模型。即在樣本點中找出計算模型所需的最少樣本數,分別計算出不同的模型(如果有m個樣本,計算模型需要n個,這需要求出

Oracle中的一些細節問題

例 按部門統計各部門員工人數,要求顯示部門號,部門名,人數,並按照降序排列 select d.deptno,count e.empno d.dname from emp e,dept d where e.deptno d.deptno group by d.deptno,d.dname order ...

C 的一些細節

1.c 中,將負數賦值給unsigned是完全合法的。例如,將 1賦值給unsigned char,那麼結果是255.2.c 中,double的精度和計算速度都要超過float,long double則需要承擔額外的執行代價。3.std ou t hi d endl 等價於std out hi 4....

迴圈的一些細節

1 迴圈執行次數相同,大迴圈放在外面還是小迴圈放在外層效率高呢?int end1 10 int end2 100 int end3 1000000 long starttime system.nanotime 開始時間 for int i 1 i end3 i long endtime system...