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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

特征点检测之SURF

發布時間:2023/12/31 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特征点检测之SURF 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、surf原理

二、特征檢測步驟

1.盒子濾波器

1.1 積分圖像

1.1 box filter

2.Hessian的構建

3.尺度空間的構建

3.1 hessian行列式

3.2 空間金字塔

3.3?特征點過濾

4.確定主方向

5.生成特征描述

三、sift和surf對比

總結


一、surf原理

surf(speed up robust features)是對sift的改進,特征點的檢測和匹配包括:
A. 構建Hessian矩陣。
B. 構建尺度空間,特征點的過濾和定位。
C. 主方向確定。
D. 生成特征描述。
與sift相比較如下改進:
A. sift在構造dog金字塔以及求dog局部空間極值比較耗時, surf使用Hessian檢測極值,使用盒狀filter求高斯模糊近似值。sift使用dog對log進行了簡化, 提高了搜索速度surt是dog的近似和簡化。
B. surf不使用降采樣改變盒狀濾波器的大小來構建尺度金字塔。
C. surf使用haar小波轉換,sift使用的是直方圖統計找關鍵點的方向。

二、特征檢測步驟

1.盒子濾波器

1.1 積分圖像

? ? ? ?圖像的積分其實就是求和,圖像積分圖中每個點的值是原圖像中該點左上角的所有像素值之和。首先建立一個數組 A 作為積分圖像,其寬高與原圖像相等。然后對這個數組賦值,每個點存儲的是該點與圖像原點所構成的矩形中所有像素的和。

積分圖像可以采用增量的方式計算:

可以看到sat(x-1, y)+sat(x, y-1)后,有一部分重合的區域,即sat(x-1, y-1),所以需減掉,最后還需要將當前坐標(x,y)的像素值包含進來。

計算某個矩形像素的和, 比如Rd所有的像素和:

Sum(Rd) = sat1+ sat4 - sat2 -sat4

所以無論矩形的尺寸大小,只需查找積分圖像 4 次就可以快速計算任意矩形內像素值的和, 即算法復雜度為 O(4)。

1.2 box filter

Harr-like的特征:?模板內有白色和黑色兩種矩形,并定義該模板的特征值為黑色矩形像素和減去白色矩形像和。

? ? ? ?對一個灰度圖而言,事先將其積分圖構建好,當需要計算灰度圖某個區域內所有像素點的像素值之和的時候,利用積分圖,通過查表運算,可以迅速得到結果使復雜度為O(MN)的求和。求方差等運算降低到O(1)或近似于O(1)的復雜度,它的缺點是不支持多尺度。

初始化步驟如下:
A.?給定一張圖像,寬高為(M,N),確定待求矩形模板的寬高(m,n),如圖紫色矩形。圖中每個黑色方塊代表一個像素,紅色方塊是假想像素。
B. 開辟一段大小為 M 的數組,記為 buff, 用來存儲計算過程的中間變量,用紅色方塊表示。
C. 將矩形模板(紫色)從左上角(0,0)開始,逐像素向右滑動,到達行末時,矩形移動到下一行的開頭(0,1),如此反復,每移動到一個新位置時,計算矩形內的像素和,保存在數組 A 中。
每次紫色矩形向右移動時,實際上就是求對應的藍色矩形的像素和,此時只要把上一次的求和結果減去藍色矩形內的第一個紅色塊,再加上它右面的一個紅色塊,就是當前位置的和了,用公式表示 sum[i] = sum[i-1] - buff[j] + buff[j+m]。

void Boxfilter::init(int width, int height, int mwidth, int mheight) {this->mwidth = mwidth;this->mheight = mheight;this->width = width;this->height = height;boxwidth = width - mwidth;boxheight = height - mheight;f_sum = new int[boxwidth *boxheight];buff = new int[width]; }void Boxfilter::boxfilter (unsigned char* img) {int j,x,y;//初始化設置0memset(buff, 0, width *sizeof(int));memset(f_sum, 0, boxwidth *boxheight);//x方向單個像素求和for(y=0; y<mheight; y++){for(x=0; x<width; x++){uchar pixel = img[y *width + x];buff[x] += pixel;}}//x和y方向求和for(y=0; y<height - mheight;y++){int Xsum=0;//x方向subSum求和for(j=0; j<mwidth; j++){Xsum += buff[j];}for(x=0; x<width - mwidth; x++){if(x!=0){ //sum[i] = sum[i-1] - buff[j] + buff[j+m].Xsum = Xsum-buff[x-1]+buff[mwidth-1+x];}f_sum[y*(width - mwidth)+x] = (float) Xsum ; }for(x=0; x<width; x++){uchar pixel = img[y *width + x]; uchar pixel2 = img[(y+mheight) *width + x]; buff[x] = buff[x] - pixel + pixel2; }} }int Boxfilter::getSum(int x, int y) {if(y>mheight/2 && y<height - mheight/2 && x>mwidth/2 && x<width - mwidth/2)return f_sum[(y - mheight/2) *boxwidth + (x - mwidth/2)];elsereturn -1; }

2.Hessian的構建

? ??Hessian矩陣的目的是為了生成圖像極值點,當hessian行列式的局部值最大的時候,檢測出的就是感興趣點。surf構造的金字塔圖像與sift有很大不同,Sift采用的是DOG圖像,而surf采用的是Hessian矩陣行列式近似值圖像。黑森矩陣(Hessian Matrix)是由一個多元函數的二階偏導數構成的方陣,描述了函數的局部曲率。

? ? 濾波的Hessian的表達式,Hessian矩陣的判別式,其實就是當前點對水平方向二階偏導數乘以垂直方向二階偏導數再減去當前水平、垂直二階偏導的二次方

? ? 離散圖像, 二階導數是對一階導數的再次求導:

? ??boxfilter對圖像的濾波轉化成計算圖像上不同區域間像素和的加減運算問題,只需要簡單幾次查找積分圖就可以完成。高斯函數的高階微分與離散的圖像函數I(x,y)做卷積運算時相當于使用高斯濾波模板對圖像做濾波處理實際運用中,高斯二階微分進行離散化和裁剪處理得到盒子濾波器近似代替高斯濾波板進行卷積計算我們需要對高斯二階微分模板進行簡化,使得簡化后的模板只是由幾個矩形區域組成,矩形區域內填充同一值,把圖像中的模板區域與圖像的卷積運算轉化為盒子濾波器的運算,如下圖所示:

? ? ?Hession矩陣判別式中的L(x,y)是原始圖像的高斯卷積為了提高運算速度,SURF算法使用了盒式濾波器來替代高斯濾波器L,所以在Lxy上乘了一個加權系數0.9,目的是為了平衡因使用盒式濾波器近似所帶來的誤差,則H矩陣判別式可表示為:? ?

? ? 對于不同的σ的值和對應尺寸的模板尺寸,w值是不同的,但為了簡化起見,可以認為它是同一個常數。 使用近似的Hessian矩陣行列式來表示圖像中某一點x處的斑點響應值,遍歷圖像中所有的像元點,便形成了在某一尺度下任意點檢測的響應圖像

3.尺度空間的構建

3.1 hessian行列式

?在surf算法的尺度空間中,每一組中任意一層包括D{xx},D{yy},D{xy}三種盒子濾波器。對一幅輸入圖像進行濾波后通過Hessian行列式計算公式可以得到對應尺度坐標下的Hessian行列式的值,所有Hessian行列式值構成一幅Hessian行列式圖像。

3.2 空間金字塔

通常想要獲取不同尺度的極值點,必須建立圖像的尺度空間金字塔。一般的方法是通過不同σ的高斯函數,對圖像進行平滑濾波,然后重采樣圖像以獲得更高一層的金字塔圖像。sift特征檢測算法中就是通過相鄰兩層圖像金字塔相減得到dog圖像,然同sift算法一樣,surf算法的尺度空間由O組S層組成,sift算法下一組圖像的長寬均是上一組的一半,同一組不同層圖像之間尺寸一樣,但是所使用的尺度空間因子(高斯模糊系數σ)逐漸增大;而在surf算法中,不同組間圖像的尺寸都是一致的,不同的是不同組間使用的盒式濾波器的模板尺寸逐漸增大,同一組不同層圖像使用相同尺寸的濾波器,但是濾波器的尺度空間因子逐漸增大

3.3?特征點過濾

定位過程和SIFT算法一致,將經過Hessian矩陣處理的每個像素點(即獲得每個像素點Hessian矩陣的判別式值)與其周圍的所有相鄰點進行比較,當其大于(或者小于)所有相鄰點時,該點就是極值點。如圖所示,中間的檢測點要和其所在圖像的3×33×3鄰域8個像素點,以及其相鄰的上下兩層3×33×3鄰域18個像素點,共26個像素點進行比較。

4.確定主方向

?

? 為了保證特征矢量具有旋轉不變性,與sift特征一樣,需要對每個特征點分配一個主方向。為些,我們需要以特征點為中心,以6σ為半徑的圓形區域,對圖像進行Haar小波響應運算。這樣做實際就是對圖像進行梯度運算只不過是我們需要利用積分圖像,提高計算圖像梯度的效率。
? SIFT算法特征點的主方向是采用在特征點鄰域內統計其梯度直方圖,橫軸是梯度方向的角度,縱軸是梯度方向對應梯度幅值的累加,取直方圖bin最大的以及超過最大80%的那些方向作為特征點的主方向,?考慮到Haar小波的模板帶寬,實際計算梯度的圖像區域是相同的。用于計算梯度的Harr小波的尺度為4s。

Harr特征值反應了圖像灰度變化的情況,那么這個主方向就是描述那些灰度變化特別劇烈的區域方向。以特征點為中心,張角為π/3的扇形滑動,計算窗口內的Harr小波響應值dx、dy的累加:

for(int i = -6; i <= 6; ++i) { for(int j = -6; j <= 6; ++j) {if(i*i + j*j < 36) {gauss = static_cast<float>(gauss25[id[i+6]][id[j+6]]);resX[idx] = gauss * haarX(r+j*s, c+i*s, 4*s);resY[idx] = gauss * haarY(r+j*s, c+i*s, 4*s);Ang[idx] = getAngle(resX[idx], resY[idx]);++idx;}} }

5.生成特征描述

? ??生成特征點描述子與確定特征點方向有些類似,它需要計算圖像的Haar小波響應, 沿主方向將20s×20s的圖像劃分為4s×4s個子塊,每個子塊利用尺寸2s的Harr模板進行響應值進行響應值計算然后對響應值進行統計∑dx?∑|dx|?∑dy?∑|dy|形成特征矢量于共有4×4個子塊,因此,特征描述子共由4×4×4=64維特征矢量組成。

為了充分利用積分圖像進行Haar小波的響應計算,并不直接旋轉Haar小波模板求得其響應值,而是在積圖像上先使用水平和垂直的Haar模板求得響應值dy和dx,然后根據主方向旋轉dx和dy與主方向操持一致

利用積分圖像與水平、垂直Harr小波,求得水平與垂直兩個方向的響應值dx和dy。對dx和dy進行高斯加權處理,并根據主方向的角度,對dx和dy進行旋轉變換

三、sift和surf對比

(1)在生成尺度空間方面,SIFT算法利用的是差分高斯金字塔與不同層級的空間圖像相互卷積生成。SURF算法采用的是不同尺度的box filters與原圖像卷積

(2)在特征點檢驗時,SIFT算子是先對圖像進行非極大值抑制,再去除對比度較低的點。然后通過Hessian矩陣去除邊緣的點。而SURF算法是先通過Hessian矩陣來檢測候選特征點,然后再對非極大值的點進行抑制

(3)在特征向量的方向確定上,SIFT算法是在正方形區域內統計梯度的幅值的直方圖,找到最大梯度幅值所對應的方向。SIFT算子確定的特征點可以有一個或一個以上方向,其中包括一個主方向與多個輔方向。SURF算法則是在圓形鄰域內,檢測各個扇形范圍內水平、垂直方向上的Haar小波響應,找到模值最大的扇形指向,且該算法的方向只有一個。

(4)SIFT算法生成描述子時,是將16*16的采樣點劃分為4*4的區域,從而計算每個分區種子點的幅值并確定其方向,共計4*4*8=128維。


總結

哈哈

總結

以上是生活随笔為你收集整理的特征点检测之SURF的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。