1. 程式人生 > >九之再續:教你一步一步用c語言實現sift演算法、下

九之再續:教你一步一步用c語言實現sift演算法、下

                      教你一步一步用c語言實現sift演算法、下


作者:July、二零一一年三月十二日
出處:http://blog.csdn.net/v_JULY_v
參考:Rob Hess維護的sift 庫
環境:windows xp+vc6.0
條件:c語言實現。
說明:本BLOG內會陸續一一實現所有經典演算法。
------------------------


本文接上,教你一步一步用c語言實現sift演算法、上,而來:
函式編寫
    ok,接上文,咱們一個一個的來編寫main函式中所涉及到所有函式,這也是本文的關鍵部分:

五個步驟

    ok,接下來,進入重點部分,咱們依據上文介紹的sift演算法的幾個步驟,來一一實現這些函式。
    為了版述清晰,再貼一下,主函式,順便再加強下對sift 演算法的五個步驟的認識:

1、SIFT演算法第一步:影象預處理
CvMat *ScaleInitImage(CvMat * im) ;                  //金字塔初始化
2、SIFT演算法第二步:建立高斯金字塔函式
ImageOctaves* BuildGaussianOctaves(CvMat * image) ;  //建立高斯金字塔
3、SIFT演算法第三步:特徵點位置檢測,最後確定特徵點的位置
int DetectKeypoint(int numoctaves, ImageOctaves *GaussianPyr);
4、SIFT演算法第四步:計算高斯影象的梯度方向和幅值,計算各個特徵點的主方向
void ComputeGrad_DirecandMag(int numoctaves, ImageOctaves *GaussianPyr);
5、SIFT演算法第五步:抽取各個特徵點處的特徵描述字
void ExtractFeatureDescriptors(int numoctaves, ImageOctaves *GaussianPyr);

ok,接下來一一具體實現這幾個函式:
SIFT演算法第一步
    SIFT演算法第一步:擴大影象,預濾波剔除噪聲,得到金字塔的最底層-第一階的第一層:

  

SIFT演算法第二步
    SIFT第二步,建立Gaussian金字塔,給定金字塔第一階第一層影象後,計算高斯金字塔其他尺度影象,
每一階的數目由變數SCALESPEROCTAVE決定,給定一個基本影象,計算它的高斯金字塔影象,返回外部向量是階梯指標,內部向量是每一個階梯內部的不同尺度影象。
  

SIFT演算法第三步
    SIFT演算法第三步,特徵點位置檢測,最後確定特徵點的位置檢測DOG金字塔中的區域性最大值,找到之後,還要經過兩個檢驗才能確認為特徵點:一是它必須有明顯的差異,二是他不應該是邊緣點,(也就是說,在極值點處的主曲率比應該小於某一個閾值)。

SIFT演算法第四步

SIFT演算法第五步
    SIFT演算法第五步:抽取各個特徵點處的特徵描述字,確定特徵點的描述字。描述字是Patch網格內梯度方向的描述,旋轉網格到主方向,插值得到網格處梯度值。
一個特徵點可以用2*2*8=32維的向量,也可以用4*4*8=128維的向量更精確的進行描述。

ok,為了版述清晰,再貼一下上文所述的主函式(注,上文已貼出,此是為了版述清晰,重複造輪):

最後,再看一下,執行效果(圖中美女為老鄉+朋友,何姐08年照):

完。 

updated