日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

SURF与SIFT比较分析

發(fā)布時(shí)間:2023/11/27 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SURF与SIFT比较分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

opencv3.2 SURF實(shí)現(xiàn)特征點(diǎn)匹配

opencv3.2中SurfFeatureDetector、SurfDescriptorExtractor、BruteForceMatcher這三個(gè)的使用方法已經(jīng)和原先2.4版本前不一樣了。

使用方法示例如下:

 Ptr<SURF> detector = SURF::create(minHessian);detector->detect(img_1, keypoints_1);Ptr<SURF> extractor = SURF::create();extractor->compute(img_1, keypoints_1, descriptors_1);Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");//這里填寫使用的匹配方式
matcher->match(descriptors_1, descriptors_2, matches);

debug版本detect函數(shù)運(yùn)行時(shí)會(huì)報(bào)錯(cuò),內(nèi)存訪問錯(cuò)誤什么的,,,,,?
具體原因還不知道,網(wǎng)上查找資料修改圖片type為CV_8U,和給vector手動(dòng)分配空間,實(shí)測(cè)沒有用,但是改為release版本可以使用

代碼:

#include<opencv2/features2d/features2d.hpp>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/xfeatures2d/nonfree.hpp>
#include<opencv2/core/core.hpp>#include<iostream>
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;
int main()
{Mat srcImage1 = imread("3.jpg", 1);Mat srcImage2 = imread("4.jpg",1);if (!srcImage1.data || !srcImage2.data){cout << "讀取圖片出錯(cuò)" << endl;return false;}imshow("原始圖1",srcImage1);imshow("原始圖2", srcImage2);int minHessian = 100;Ptr<SurfFeatureDetector> detector = SurfFeatureDetector::create(minHessian);vector<cv::KeyPoint> key_points_1, key_points_2;Mat dstImage1, dstImage2;detector->detectAndCompute(srcImage1,Mat(), key_points_1,dstImage1);detector->detectAndCompute(srcImage2,Mat(), key_points_2,dstImage2);//可以分成detect和computeMat img_keypoints_1, img_keypoints_2;drawKeypoints(srcImage1,key_points_1,img_keypoints_1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);drawKeypoints(srcImage2, key_points_2, img_keypoints_2, Scalar::all(-1),DrawMatchesFlags::DEFAULT);Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");vector<DMatch>mach;matcher->match(dstImage1,dstImage2,mach);double Max_dist = 0;double Min_dist = 100;for (int i = 0; i < dstImage1.rows; i++){double dist = mach[i].distance;if (dist < Min_dist)Min_dist = dist;if (dist > Max_dist)Max_dist = dist;}cout << "最短距離" << Min_dist << endl;cout << "最長距離" << Max_dist << endl;vector<DMatch>goodmaches;for (int i = 0; i < dstImage1.rows; i++){if (mach[i].distance < 2 * Min_dist)goodmaches.push_back(mach[i]);}Mat img_maches;drawMatches(srcImage1,key_points_1,srcImage2,key_points_2,goodmaches,img_maches);for (int i = 0; i < goodmaches.size(); i++){cout << "符合條件的匹配:" << goodmaches[i].queryIdx << "--" << goodmaches[i].trainIdx << endl;}imshow("效果圖1", img_keypoints_1);imshow("效果圖2", img_keypoints_2);imshow("匹配效果",img_maches);waitKey(0);return 0;
}

?

SURF與SIFT

?

共同點(diǎn):

SIFT/SURF為了實(shí)現(xiàn)不同圖像中相同場(chǎng)景的匹配,主要包括三個(gè)步驟:

1、尺度空間的建立;

2、特征點(diǎn)的提取;

3、利用特征點(diǎn)周圍鄰域的信息生成特征描述子

4、特征點(diǎn)匹配。

? 推薦:http://blog.csdn.net/cy513/archive/2009/08/05/4414352.aspx

? ? ? 如果兩幅圖像中的物體一般只是旋轉(zhuǎn)和縮放的關(guān)系,加上圖像的亮度及對(duì)比度的不同,要在這些條件下要實(shí)現(xiàn)物體之間的匹配,SIFT算法的先驅(qū)及其發(fā)明者想到只要找到多于三對(duì)物體間的匹配點(diǎn)就可以通過射影幾何的理論建立它們的一一對(duì)應(yīng)。

? ? ? 如何找到這樣的匹配點(diǎn)呢?SIFT/SURF作者的想法是首先找到圖像中的一些“穩(wěn)定點(diǎn)”,這些點(diǎn)是一些特殊的點(diǎn),不會(huì)因?yàn)橐暯堑母淖儭⒐庹盏淖兓⒃胍舻母蓴_而消失,比如角點(diǎn)、邊緣點(diǎn)、暗區(qū)域的亮點(diǎn)以及亮區(qū)域的暗點(diǎn)。這樣如果兩幅圖像中有相同的景物,那么這些穩(wěn)定點(diǎn)就會(huì)在兩幅圖像的相同景物上同時(shí)出現(xiàn),這樣就能實(shí)現(xiàn)匹配。因此,SIFT/SURF算法的基礎(chǔ)是穩(wěn)定點(diǎn)。

? ? ? SIFT/SURF提取的穩(wěn)定點(diǎn),首先都要求是局部極值。但是,當(dāng)兩個(gè)物體的大小比例不一樣時(shí),大圖像的局部極值點(diǎn)在小圖像的對(duì)應(yīng)位置上有可能不是極值點(diǎn)。于是SIFT/SURF都采用圖像金字塔的方法,每一個(gè)截面與原圖像相似,這樣兩個(gè)金字塔中就有可能包含大小最近似的兩個(gè)截面了。

? ? ? 這樣找到的特征點(diǎn)會(huì)比較多,經(jīng)過一些處理后濾掉一些相對(duì)不穩(wěn)定的點(diǎn)。

? ? ? 接下來如何去匹配相同物體上對(duì)應(yīng)的點(diǎn)呢?SIFT/SURF的作者都想到以特征點(diǎn)為中心,在周圍鄰域內(nèi)統(tǒng)計(jì)特征,將特征附加到穩(wěn)定點(diǎn)上,生成特征描述子。在遇到旋轉(zhuǎn)的情況下,作者們都決定找出一個(gè)主方向,然后以這個(gè)方向?yàn)閰⒖甲鴺?biāo)進(jìn)行后面的特征統(tǒng)計(jì),就解決了旋轉(zhuǎn)的問題。

?

共同的大問題有以下幾個(gè):

1、為什么選用高斯金字塔來作特征提取?

? ? ? 為什么是DOG的金字塔?因?yàn)樗咏麹OG,而LOG的極值點(diǎn)提供了最穩(wěn)定的特征,而且DOG方便計(jì)算(只要做減法。)

? ? ? 為什么LOG的極值點(diǎn)提供的特征最穩(wěn)定,有參考文獻(xiàn),未看。

???? (7.12補(bǔ)充:)直觀理解:特征明顯的點(diǎn)經(jīng)過不同尺度的高斯濾波器進(jìn)行濾波后,差別較大,所以用到的是DOG。

? ? ? 但是直觀上怎么理解?如果相鄰Octave的sigma不是兩倍關(guān)系還好理解:如果兩幅圖像只是縮放的關(guān)系,那么假設(shè)第一個(gè)Octave找到了小一倍圖像的極值點(diǎn),那么大一倍圖像的極值點(diǎn)會(huì)在下一個(gè)Octave找到相似的。但是現(xiàn)在,如果把大一倍圖像進(jìn)行一次下采樣(這樣和小的圖像就完全一樣了),進(jìn)行Gauss濾波時(shí),兩個(gè)圖像濾波系數(shù)(sigma)是不一樣的,不就找不到一樣的極值點(diǎn)了么?不理解。

2、Hessian矩陣為什么能用來篩選極值點(diǎn)?

? ? ? SIFT先利用非極大抑制,再用到Hessian矩陣進(jìn)行濾除。SURF先用Hessian矩陣,再進(jìn)行非極大抑制。SURF的順序可以加快篩選速度么?(Hessian矩陣濾除的點(diǎn)更多?)

? ? ? 至于SURF先用Hessian矩陣,再進(jìn)行非極大抑制的原因,是不管先極大值抑制還是判斷Hessian矩陣的行列式,金字塔上的點(diǎn)的行列式都是要計(jì)算出來的。先判斷是否大于0只要進(jìn)行1次判斷,而判斷是否是極大值點(diǎn)或者極小值點(diǎn)要與周圍26個(gè)點(diǎn)比較,只比較1次肯定快。

? ? ? 而在SIFT中,構(gòu)建的高斯金字塔只有一座(不想SURF是有3座),要進(jìn)行非極大抑制可以直接用金字塔的結(jié)果進(jìn)行比較。而如果計(jì)算Hessian矩陣的行列式,還要再計(jì)算Dxx、Dxy、Dyy。因此先進(jìn)行非極大抑制。這兩個(gè)步驟的先后與SIFT/SURF的實(shí)際計(jì)算情況有關(guān)的,都是當(dāng)前算法下的最佳順序,而不是說哪種先計(jì)算一定更好。

3、為什么采用梯度特征作為局部不變特征?

? ? ? 這與人的視覺神經(jīng)相關(guān)。采用梯度作為描述子的原因是,人的視覺皮層上的神經(jīng)元對(duì)特定方向和空間頻率的梯度相應(yīng)很敏感,經(jīng)過SIFT作者的一些實(shí)驗(yàn)驗(yàn)證,用梯度的方法進(jìn)行匹配效果很好。

4、為什么可以采用某些特征點(diǎn)的局部不變特征進(jìn)行整幅圖像的匹配?

從直觀的人類視覺印象來看,人類視覺對(duì)物體的描述也是局部化的,基于局部不變特征的圖像識(shí)別方法十分接近于人類視覺機(jī)理,通過局部化的特征組合,形成對(duì)目標(biāo)物體的整體印象,這就為局部不變特征提取方法提供了生物學(xué)上的解釋,因此局部不變特征也得到了廣泛應(yīng)用。

? ? ? 還有:

? ? ? 圖像中的每個(gè)局部區(qū)域的重要性和影響范圍并非同等重要,即特征不是同等顯著的,其主要理論來源是Marr的計(jì)算機(jī)視覺理論和Treisman的特征整合理論,一般也稱為“原子論”。該理論認(rèn)為視覺的過程開始于對(duì)物體的特征性質(zhì)和簡單組成部分的分析,是從局部性質(zhì)到大范圍性質(zhì)。

? ? ? SIFT/SURF都是對(duì)特征點(diǎn)的局部區(qū)域的描述,這些特征點(diǎn)應(yīng)該是影響重要的點(diǎn),對(duì)這些點(diǎn)的分析更加重要。所以在局部不變特征的提取和描述時(shí)也遵循與人眼視覺注意選擇原理相類似的機(jī)制,所以SIFT/SURF用于匹配有效果。

?

?

不同點(diǎn)的比較:

總結(jié)

?

SIFT

SURF

尺度空間

DOG與不同尺度的圖片卷積

不同尺度的box filters與原圖片卷積

特征點(diǎn)檢測(cè)

先進(jìn)行非極大抑制,再去除低對(duì)比度的點(diǎn)。再通過Hessian矩陣去除邊緣的點(diǎn)

先利用Hessian矩陣確定候選點(diǎn),然后進(jìn)行非極大抑制

方向

在正方形區(qū)域內(nèi)統(tǒng)計(jì)梯度的幅值的直方圖,找max對(duì)應(yīng)的方向。可以有多個(gè)方向。

在圓形區(qū)域內(nèi),計(jì)算各個(gè)扇形范圍內(nèi)x、y方向的haar小波響應(yīng),找模最大的扇形方向

特征描述子

16*16的采樣點(diǎn)劃分為4*4的區(qū)域,計(jì)算每個(gè)區(qū)域的采樣點(diǎn)的梯度方向和幅值,統(tǒng)計(jì)成8bin直方圖,一共4*4*8=128維

20*20s的區(qū)域劃分為4*4的子區(qū)域,每個(gè)子區(qū)域找5*5個(gè)采樣點(diǎn),計(jì)算采樣點(diǎn)的haar小波響應(yīng),記錄∑dx,?∑dy,∑|dx|,∑|dy|,一共4*4*4=64維

?SURF—金字塔僅僅是用來做特征點(diǎn)的檢測(cè)。在計(jì)算描述子的時(shí)候,haar小波響應(yīng)是計(jì)算在原圖像(利用積分圖)。而SIFT是計(jì)算在高斯金字塔上(注意不是高斯差分金字塔。)

性能的比較:

論文:A comparison of SIFT, PCA-SIFT and SURF??對(duì)三種方法給出了性能上的比較,源圖片來源于Graffiti dataset,對(duì)原圖像進(jìn)行尺度、旋轉(zhuǎn)、模糊、亮度變化、仿射變換等變化后,再與原圖像進(jìn)行匹配,統(tǒng)計(jì)匹配的效果。效果以可重復(fù)出現(xiàn)性為評(píng)價(jià)指標(biāo)。

比較的結(jié)果如下:

method

Time

Scale

Rotation

Blur

Illumination

Affine

Sift

common

best

best

common

common

good

Pca-sift

good

good

good

best

good

best

Surf?

best

common

common

good

best

good

?

????

由此可見,SIFT在尺度和旋轉(zhuǎn)變換的情況下效果最好,SURF在亮度變化下匹配效果最好,在模糊方面優(yōu)于SIFT,而尺度和旋轉(zhuǎn)的變化不及SIFT,旋轉(zhuǎn)不變上比SIFT差很多。速度上看,SURF是SIFT速度的3倍。

參考:

http://apps.hi.baidu.com/share/detail/32318290

http://blog.csdn.net/ijuliet/archive/2009/10/07/4640624.aspx

http://blog.csdn.net/cy513/article/details/4414352

http://www.cnblogs.com/mysunnyday/archive/2011/08/31/2160298.html

https://blog.csdn.net/xxzxxzdlut/article/details/72926011

?

總結(jié)

以上是生活随笔為你收集整理的SURF与SIFT比较分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。