久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    OpenCV2學(xué)習(xí)筆記(十二):特征提取算法SIFT與SURF

     Y忍冬草 2016-12-13

    當(dāng)嘗試在不同圖像之間進(jìn)行特征匹配時,通常會遇到圖像的大小、方向等參數(shù)發(fā)生改變的問題,簡而言之,就是尺度變化的問題。每幅圖像在拍攝時與目標(biāo)物體的距離是不同的,因此要識別的目標(biāo)物體在圖像中自然會存在不同的尺寸。

    因此,計算機(jī)視覺中引入尺度不變的特征,主要的思想是每個檢測到的特征點都伴隨對應(yīng)的尺度因子。1999年David Lowe提出了著名的尺度不變特征檢測器SIFT(Scale Invariant Feature Transform)算法,它具有尺度,旋轉(zhuǎn),仿射,視角,光照不變性。而加速魯棒特性特征SURF(Speeded Up Robust Features)算法是SIFT的高效變種。這兩個算法申請了專利保護(hù),其專利的擁有者為英屬哥倫比亞大學(xué)。

    關(guān)于SIFT和SURF的特征介紹,已經(jīng)有很多的blog對其進(jìn)行簡介了,見參考的blog。由于還沒有將2004年那篇原文精細(xì)看完,因此這里只能粗淺地分析兩種算法,并描述在OpenCV中如何實現(xiàn)這兩種算法的特征檢測。

    一、基本概念

    1.1 算法背景

    尺度不變特征轉(zhuǎn)換SIFT是一種著名的計算機(jī)視覺的算法,主要用來檢測圖像中的局部特征,通過在圖像中尋找極值點特征,并提取出其這些特征點的位置、尺度和旋轉(zhuǎn)不變量等信息。
    其應(yīng)用范圍包含物體辨識、機(jī)器人地圖感知與導(dǎo)航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對。

    局部影像特征的描述與偵測可以幫助辨識物體,SIFT 特征是基于物體上的一些局部外觀的興趣點而與影像的大小和旋轉(zhuǎn)無關(guān)。對于光線、噪聲、些微視角改變的容忍度也相當(dāng)高。基于這些特性,它們是高度顯著而且相對容易擷取,在母數(shù)龐大的特征數(shù)據(jù)庫中,很容易辨識物體而且鮮有誤認(rèn)。使用 SIFT特征描述對于部分物體遮蔽的偵測率也相當(dāng)高,甚至只需要3個以上的SIFT物體特征就足以計算出位置與方位。在現(xiàn)今的電腦硬件速度下和小型的特征數(shù)據(jù)庫條件下,辨識速度可接近即時運(yùn)算。SIFT特征的信息量大,適合在海量數(shù)據(jù)庫中快速準(zhǔn)確匹配。(來自百度百科的解釋)

    1.2 SIFT算法的主要優(yōu)點

    1. SIFT特征是圖像的局部特征,其對旋轉(zhuǎn)、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩(wěn)定性;
    2. 獨(dú)特性(Distinctiveness)好,信息量豐富,適用于在海量特征數(shù)據(jù)庫中進(jìn)行快速、準(zhǔn)確的匹配;
    3. 多量性,即使少數(shù)的幾個物體也可以產(chǎn)生大量的SIFT特征向量;
    4. 高速性,經(jīng)優(yōu)化的SIFT匹配算法甚至可以達(dá)到實時的要求;
    5. 可擴(kuò)展性,可以很方便的與其他形式的特征向量進(jìn)行聯(lián)合。

    1.3 SIFT算法的適用環(huán)境

    目標(biāo)的自身狀態(tài)、場景所處的環(huán)境和成像器材的成像特性等因素影響圖像配準(zhǔn)/目標(biāo)識別跟蹤的性能。而SIFT算法在一定程度上可解決:

    1. 目標(biāo)的旋轉(zhuǎn)、縮放、平移(RST)
    2. 圖像仿射/投影變換(視點viewpoint)
    3. 光照影響(illumination)
    4. 目標(biāo)遮擋(occlusion)
    5. 雜物場景(clutter)
    6. 噪聲

    SIFT算法的實質(zhì)是在不同的尺度空間上查找關(guān)鍵點(特征點),并計算出關(guān)鍵點的方向。SIFT所查找到的關(guān)鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區(qū)的亮點及亮區(qū)的暗點等。

    1.4 算法的基本步驟

    Lowe將SIFT算法分解為如下四步:

    1. 尺度空間極值檢測:搜索所有尺度上的圖像位置。通過高斯微分函數(shù)來識別潛在的對于尺度和旋轉(zhuǎn)不變的興趣點。
    2. 關(guān)鍵點定位:在每個候選的位置上,通過一個擬合精細(xì)的模型來確定位置和尺度。關(guān)鍵點的選擇依據(jù)于它們的穩(wěn)定程度。
    3. 方向確定:基于圖像局部的梯度方向,分配給每個關(guān)鍵點位置一個或多個方向。所有后面的對圖像數(shù)據(jù)的操作都相對于關(guān)鍵點的方向、尺度和位置進(jìn)行變換,從而提供對于這些變換的不變性。
    4. 特征點描述:在每個關(guān)鍵點周圍的鄰域內(nèi),在選定的尺度上測量圖像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。

    1.5 SIFT算法的缺點

    SIFT算法十分強(qiáng)大,精度很高,Mikolajczyk和Schmid曾經(jīng)針對不同的場景,對光照變化、圖像幾何變形、分辨率差異、旋轉(zhuǎn)、模糊和圖像壓縮等6種情況,就多種最具代表性的描述子(如SIFT,矩不變量,互相關(guān)等10種描述子)進(jìn)行了實驗和性能比較,結(jié)果表明,在以上各種情況下,SIFT描述子的性能最好。但算法的高深同樣帶來了一些缺點,如:

    1. 實時性不高。
    2. 有時特征點較少。
    3. 對邊緣光滑或經(jīng)過平滑的圖像無法準(zhǔn)確提取特征點。

    針對這些問題,一些改進(jìn)算法應(yīng)運(yùn)而生,SURF就是廣為人知的其中一種算法。

    2.1 SURF算法介紹

    SURF算法是SIFT算法的高效變種,在滿足一定效果的情況下完成兩幅圖像中物體的匹配,并基本實現(xiàn)了實時處理。SURF也檢測空間域和尺度域上的局部極大值作為特征,但是使用的是Hessian行列式響應(yīng)而不是Laplacian行列式。

    SURF的實現(xiàn)如下,首先對每個像素計算Hessian矩陣以得到特征,該矩陣測量一個函數(shù)的局部曲率,定義如下:

    這里寫圖片描述

    該矩陣的行列式給出曲率的強(qiáng)度,定義角點為具有較高局部曲率的像素點(即在多個方向都具有高曲率)。由于該函數(shù)是由二階導(dǎo)數(shù)組成,因此可以使用不同的這里寫圖片描述 尺度的Laplacian Gaussian核進(jìn)行計算,因此Hessian變成了三個變量的函數(shù)。當(dāng)Hessian的值同時在空間域和尺度域上均達(dá)到局部極大值時(需要運(yùn)行3*3*3的非極大值抑制),可以認(rèn)為找到了尺度不變的特征。

    所有這些不同尺度的運(yùn)算都很耗時,而SURF算法的目的是盡可能高效。因此會使用近似的高斯核,僅涉及少量整數(shù)加法,結(jié)構(gòu)如下圖所示:

    這里寫圖片描述

    左側(cè)的核用于估計混合二階導(dǎo)數(shù),右側(cè)的核則用于估算垂直方向的二階導(dǎo)數(shù),而其旋轉(zhuǎn)版本則用于估計水平方向的二階導(dǎo)數(shù)。

    一旦識別了局部極大值,每個特征點的精確位置可以通過空間域及尺度域上進(jìn)行插值獲取,結(jié)果是一組具有亞像素精確度的特征點,以及一個對應(yīng)的尺度值。

    這里寫圖片描述

    2.2 性能比較

    無需贅述,A comparison of SIFT, PCA-SIFT and SURF 一文給出了SIFT和SURF的性能比較,對原圖像進(jìn)行尺度、旋轉(zhuǎn)、模糊、亮度變化、仿射變換等變化后,再與原圖像進(jìn)行匹配,統(tǒng)計匹配的效果,源圖片來源于Graffiti dataset。

    這里寫圖片描述

    這里使用的開發(fā)平臺是Qt5.3.2+OpenCV2.4.9。SURF、SIFT特征在OpenCV中的實現(xiàn)均使用了cv::FeatureDetector接口,OpenCV中的opencv_nonfree模塊包含了SURF和SIFT的相關(guān)函數(shù),因此在使用時注意添加相關(guān)的頭文件。在這里,特征點的計算基于浮點核,因此這兩種算法相比其他算法在空間和尺度檢測上更加精確,但相對耗時。

    至于理論部分有待進(jìn)一步學(xué)習(xí)。

    二、實現(xiàn)SIFT特征檢測算法

    直接在Qt中創(chuàng)建一個控制臺項目,在main函數(shù)中添加:

    #include <QCoreApplication>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/features2d/features2d.hpp>
    #include <opencv2/nonfree/nonfree.hpp>
    
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        // 讀入圖像
        cv::Mat image= cv::imread("c:/018.jpg",0);
        cv::namedWindow("Original Image");
        cv::imshow("Original Image", image);
        // 特征點的向量
        std::vector<cv::KeyPoint>keypoints;
            // 構(gòu)造SIFT特征檢測器
        cv::SiftFeatureDetector sift(
            0.03,  // 特征的閾值
            10.);  // 用于降低
    
        // 檢測SIFT特征值
        sift.detect(image,keypoints);
    
        cv::drawKeypoints(image, // 原始圖像
                          keypoints, // 特征點的向量
                          featureImage, // 生成圖像
                          cv::Scalar(255,255,255), // 特征點的顏色
                          cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); // 標(biāo)志位
    
        cv::namedWindow("SIFT Features");
        cv::imshow("SIFT Features",featureImage);
    
        return a.exec();
    }
    

    效果如下,在函數(shù)cv::drawKeypoints中我們使用cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS作為標(biāo)志位,這樣唉使用DRAW_RICH_KEYPOINTS之后每個關(guān)鍵點上圓圈的尺寸與特征的尺度成正比:

    這里寫圖片描述

    三、實現(xiàn)SURF特征檢測算法

    #include <QCoreApplication>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/features2d/features2d.hpp>
    #include <opencv2/nonfree/nonfree.hpp>
    
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        // 讀入圖像
        cv::Mat image= cv::imread("c:/018.jpg",0);
        cv::namedWindow("Original Image");
        cv::imshow("Original Image", image);
        // 特征點的向量
        std::vector<cv::KeyPoint>keypoints;
    
        // 構(gòu)造SURF特征檢測器
        cv::SurfFeatureDetector surf(2500);
        // 檢測SURF特征
        surf.detect(image,keypoints);
    
        cv::Mat featureImage;
        cv::drawKeypoints(image, // 原始圖像
                          keypoints, // 特征點的向量
                          featureImage, // 生成圖像
                          cv::Scalar(255,255,255), // 特征點的顏色
                          cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); // 標(biāo)志位
    
        cv::namedWindow("SURF Features");
        cv::imshow("SURF Features",featureImage);
    
        return a.exec();
    }
    

    效果:

    這里寫圖片描述

    從兩種算法的輸出結(jié)果可以看出,SURF與SIFT描述子的區(qū)別主要是速度及精度。SURF描述子大部分基于強(qiáng)度的差值,計算更加快捷,而SIFT描述子通常在搜索正確的特征點時更加精確。

    參考資料:

    David G.Lowe Object Recognition from Local Scale-Invariant Features. 1999.

    David G.Lowe Distinctive Image Features from Scale-Invariant Keypoints. January 5, 2004.

    SIFT官網(wǎng)的Rob Hess hess@eecs.oregonstate.edu SIFT源碼

    參考博客:

    http://blog.csdn.net/zddblog/article/details/7521424 (個人認(rèn)為是目前最詳盡的SIFT介紹)

    http://underthehood.blog.51cto.com/2531780/658350

    http://blog.csdn.net/xiaowei_cqu/article/details/8069548

    http://www.cnblogs.com/tornadomeet/archive/2012/08/16/2643168.html

    //---------------------------------------------------------------

    轉(zhuǎn)自:http://www./Article/27566

    感謝分享

    //---------------------------------------------------------------


      本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 大地资源免费视频观看| 国产精品乱码久久久久久软件| 精品无码一区二区三区在线| 亚洲真人无码永久在线| 老司机精品成人无码AV| 四虎永久在线精品免费一区二区| 亚洲色大成网站WWW久久| 护士张开腿被奷日出白浆| 日韩中文字幕国产精品| 国产乱妇乱子在线视频| 国产精品无码av不卡| 午夜男女爽爽影院免费视频下载| 中文 在线 日韩 亚洲 欧美| 欧美成 人影片 免费观看| 久久毛片少妇高潮| 人妻丰满熟妇AV无码区动漫| 一区二区三区国产不卡| 精品无码一区二区三区亚洲桃色| 最新亚洲人成网站在线影院| 国产真人无码作爱视频免费 | 久久婷婷国产剧情内射白浆| 久久这里有精品国产电影网| 无码精品人妻一区二区三区影院 | 中文字幕在线观看| 人妻少妇邻居少妇好多水在线| 精品人妻av区乱码| 国产波霸爆乳一区二区| 亚洲情A成黄在线观看动漫尤物 | A毛片毛片看免费| 亚洲国产美女精品久久久 | 亚洲av永久无码精品网站| 久久精品国产亚洲AV麻豆长发| 中文字幕国产在线精品| 国产乱码卡二卡三卡4| 亚洲国产成人精品福利无码| 精品一区二区中文字幕| 精品人妻中文无码AV在线| 国产在线高清视频无码| 久久99热只有频精品8| 亚洲人成电影网站色mp4| 久久久久久亚洲精品成人|