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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机视觉——SIFT算法

發(fā)布時(shí)間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机视觉——SIFT算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 一、SIFT算法特點(diǎn)
  • 二、SIFT算法實(shí)質(zhì)
  • 三、SIFT算法實(shí)現(xiàn)特征匹配主要有以下流程:
    • 1、**特征點(diǎn)位置和尺度的提取**:
    • 2、**特征點(diǎn)方向的提取**
    • 3、**特征提取匯總**
    • 4、**特征描述**
    • 4、**特征匹配**
  • 四、提取關(guān)鍵點(diǎn)可視化
  • 五、匹配地理標(biāo)記圖像
    • 1.源碼
    • 2.運(yùn)行結(jié)果
  • 總結(jié)


前言

SIFT,即尺度不變特征變換(Scale-invariant feature transform,SIFT),是用于圖像處理領(lǐng)域的一種描述。這種描述具有尺度不變性,可在圖像中檢測(cè)出關(guān)鍵點(diǎn),是一種局部特征描述子。


一、SIFT算法特點(diǎn)

1、具有較好的穩(wěn)定性和不變性,能夠適應(yīng)旋轉(zhuǎn)、尺度縮放、亮度的變化,能在一定程度上不受視角變化、仿射變換、噪聲的干擾。
2、區(qū)分性好,能夠在海量特征數(shù)據(jù)庫中進(jìn)行快速準(zhǔn)確的區(qū)分信息進(jìn)行匹配
3、多量性,就算只有單個(gè)物體,也能產(chǎn)生大量特征向量
4、高速性,能夠快速的進(jìn)行特征向量匹配
5、可擴(kuò)展性,能夠與其它形式的特征向量進(jìn)行聯(lián)合

二、SIFT算法實(shí)質(zhì)

在不同的尺度空間上查找關(guān)鍵點(diǎn),并計(jì)算出關(guān)鍵點(diǎn)的方向。

三、SIFT算法實(shí)現(xiàn)特征匹配主要有以下流程:

1、特征點(diǎn)位置和尺度的提取

在 特征提取 步驟下,其主要應(yīng)用了圖像金字塔 和 圖像尺度空間
1.圖像金字塔
將圖像經(jīng)過一系列的降采樣,不同大小的圖片其空間形狀像是金字塔,因此得名。
2. 圖像尺度空間
將圖像經(jīng)過不同尺度(σ)的高斯卷積算子,進(jìn)而得到不同高斯尺度(σ)下的圖像

具體步驟如下:
1.將相同size的相鄰高斯尺度之間的灰度圖像進(jìn)行減法運(yùn)算,進(jìn)而得到高斯差分圖像。可以看得出其邊緣特征比較明顯。
2.然后在高斯差分圖像上檢測(cè)特征點(diǎn)。

  • 假若一個(gè)像素點(diǎn)比其 周圍8個(gè)點(diǎn) + 相鄰兩個(gè)高斯差分圖像上對(duì)應(yīng)的18個(gè)點(diǎn) 的像素值(共26個(gè))都大或都小,則該點(diǎn)為特征點(diǎn)。
  • 該特征點(diǎn)的尺度信息來自于 1. 檢測(cè)出特征點(diǎn)所在的高斯差分圖像,其圖像的與原圖的長寬比例 2. 檢測(cè)出特征點(diǎn)所在的高斯差分圖像的高斯尺度

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

選擇好特征點(diǎn)之后,還需要提取出特征點(diǎn)特方向信息。在特征點(diǎn)所在的 系數(shù)*高斯尺度(σ)為長寬的正方形區(qū)域內(nèi),求像素點(diǎn)之間梯度變化的方向。
將方向劃分到以45°為間隔的8個(gè)方向內(nèi) 進(jìn)行統(tǒng)計(jì), 最多的方向則為該特征點(diǎn)的主方向

3、特征提取匯總

SIFT算法 有了特征點(diǎn)的位置、尺度、方向三個(gè)信息,之后再依據(jù)尺度、方向?qū)μ卣鼽c(diǎn)進(jìn)行描述,則特征點(diǎn)的特征向量將具有尺度不變性和旋轉(zhuǎn)不變性。

4、特征描述

依據(jù)尺度、方向?qū)μ卣鼽c(diǎn)進(jìn)行描述。

尺度信息體現(xiàn)在特征點(diǎn)的描述區(qū)域范圍,是系數(shù)*尺度

方向信息:

以特征點(diǎn)的主方向作為特征描述的X軸,在其坐標(biāo)系的四個(gè)象限上分別劃出2*2個(gè)小格子,每個(gè)小格子分別對(duì)格子中的灰度變化方向進(jìn)行統(tǒng)計(jì)。

每個(gè)小格子統(tǒng)計(jì)出來一個(gè)按照8個(gè)方向劃分,8個(gè)方向的數(shù)量 歸一化后的結(jié)果,成為一個(gè)8維的向量。

一共4個(gè)象限即44個(gè)小格子, 44*8=128, 最終SIFT的特征點(diǎn)將用128維向量表示。

(如果主方向?yàn)?5°的倍數(shù),按其作為主方向去描述后,有些位置的灰度值和方向需要通過插值得到)

4、特征匹配

考慮到特征向量中的元素為浮點(diǎn)數(shù),向量之間的距離計(jì)算采用歐式距離進(jìn)行計(jì)算。

當(dāng)距離小于某一閾值時(shí),認(rèn)為兩個(gè)特征點(diǎn)匹配上了,即匹配成功。

四、提取關(guān)鍵點(diǎn)可視化

from numpy import loadtxt, array, concatenate, zeros, dot, arccosfrom numpy.linalg import linalg from pylab import * from PIL import Image from numpy import * import os from numpy import loadtxt, arange, cos, sin, pidef process_image(imagename, resultname, params="--edge-thresh 10 --peak-thresh 5"):"""處理一幅圖像,然后將結(jié)果保存在文件中"""if imagename[-3:] != 'pgm':# 創(chuàng)建一個(gè)pgm文件im = Image.open(imagename).convert('L')im.save('tmp.pgm')imagename = 'tmp.pgm'cmmd = str("C:/Users/Administrator/Desktop/vlfeat-0.9.20-bin/vlfeat-0.9.20/bin/win64/sift.exe " + imagename + " --output=" + resultname + " " + params)os.system(cmmd)print('processed', imagename, 'to', resultname)def read_features_from_file(filename):"""讀取特征值屬性值,然后將其以矩陣形式返回"""f = loadtxt(filename)return f[:, :4], f[:, 4:] # 特征位置,描述子def plot_features(im, locs, circle=False):"""顯示帶有特征的圖像輸入:im(數(shù)組圖像),locs(每個(gè)特征的行、列、尺度和方向角度)"""def draw_circle(c,r):t = arange(0,1.01,.01)*2*pix = r*cos(t) + c[0]y = r*sin(t) + c[1]plot(x,y,'b',linewidth=2)imshow(im)if circle:for p in locs:draw_circle(p[:2],p[2])else:plot(locs[:,0],locs[:,1],'ob')axis('off')returndef match(desc1, desc2):"""對(duì)于第一幅圖像的每個(gè)描述子,選取其在第二幅圖像中的匹配輸入:desc1(第一幅圖像中的描述子),desc2(第二幅圖像中的描述子)"""desc1 = array([d/linalg.norm(d) for d in desc1])desc2 = array([d/linalg.norm(d) for d in desc2])dist_ratio = 0.6desc1_size = desc1.shapematchscores = zeros((desc1_size[0],1), 'int')desc2t = desc2.T #預(yù)先計(jì)算矩陣轉(zhuǎn)置for i in range(desc1_size[0]):dotprods = dot(desc1[i,:], desc2t) #向量點(diǎn)乘dotprods = 0.9999*dotprods# 反余弦和反排序,返回第二幅圖像中特征的索引index = argsort(arccos(dotprods))# 檢查最近鄰的角度是否小于dist_ratio乘以第二近鄰的角度if arccos(dotprods)[index[0]] < dist_ratio * arccos(dotprods)[index[1]]:matchscores[i] = int(index[0])return matchscoresdef match_twosided(desc1,decs2):"""雙向?qū)ΨQ版本的match"""matches_12 = match(desc1, decs2)matches_21 = match(decs2, decs2)ndx_12 = matches_12.nonzero()[0]# 去除不對(duì)稱匹配for n in ndx_12:if matches_21[int(matches_12[n])] != n:matches_12[n] = 0return matches_12def appendimages(im1, im2):"""返回將兩幅圖像并排拼接成的一幅新圖像"""# 選取具有最少行數(shù)的圖像,然后填充足夠的空行row1 = im1.shape[0]row2 = im2.shape[0]if row1 < row2:im1 = concatenate((im1,zeros((row2-row1,im1.shape[1]))), axis=0)elif row1 > row2:im2 = concatenate((im2,zeros((row1-row2,im2.shape[1]))), axis=0)# 如果這些情況都沒有,那么他們的行數(shù)相同,不需要進(jìn)行填充return concatenate((im1,im2), axis=1)if __name__ == '__main__':imname = 'image/yankui1.jpg'im1 = array(Image.open(imname).convert('L'))process_image(imname, 'yankui1.sift')l1, d1 = read_features_from_file('image/yankui1.sift')figure()gray()plot_features(im1, l1, circle=True)show()

五、匹配地理標(biāo)記圖像

1.源碼

源碼如下(示例):

from pylab import * from PIL import Image from PCV.localdescriptors import sift from PCV.tools import imtools import pydot""" This is the example graph illustration of matching images from Figure 2-10. To download the images, see ch2_download_panoramio.py."""download_path = "./image" # set this to the path where you downloaded the panoramio images path = "./image" # path to save thumbnails (pydot needs the full system path)imlist = imtools.get_imlist(download_path) nbr_images = len(imlist)featlist = [imname[:-3] + 'sift' for imname in imlist] for i, imname in enumerate(imlist):sift.process_image(imname, featlist[i])matchscores = zeros((nbr_images, nbr_images))for i in range(nbr_images):for j in range(i, nbr_images): # only compute upper triangleprint('comparing ', imlist[i], imlist[j])l1, d1 = sift.read_features_from_file(featlist[i])l2, d2 = sift.read_features_from_file(featlist[j])matches = sift.match_twosided(d1, d2)nbr_matches = sum(matches > 0)print('number of matches = ', nbr_matches)matchscores[i, j] = nbr_matches print("The match scores is: \n", matchscores)# copy values for i in range(nbr_images):for j in range(i + 1, nbr_images): # no need to copy diagonalmatchscores[j, i] = matchscores[i, j]#可視化threshold = 2 # min number of matches needed to create linkg = pydot.Dot(graph_type='graph') # don't want the default directed graphfor i in range(nbr_images):for j in range(i + 1, nbr_images):if matchscores[i, j] > threshold:# first image in pairim = Image.open(imlist[i])im.thumbnail((100, 100))filename = path + str(i) + '.png'im.save(filename) # need temporary files of the right sizeg.add_node(pydot.Node(str(i), fontcolor='transparent', shape='rectangle', image=filename))# second image in pairim = Image.open(imlist[j])im.thumbnail((100, 100))filename = path + str(j) + '.png'im.save(filename) # need temporary files of the right sizeg.add_node(pydot.Node(str(j), fontcolor='transparent', shape='rectangle', image=filename))g.add_edge(pydot.Edge(str(i), str(j))) g.write_png('whitehouse.png')

2.運(yùn)行結(jié)果

imag文件夾中放入同一場(chǎng)景的序列圖像(如下):
ps:場(chǎng)景為集美大學(xué)陳延奎圖書館

運(yùn)行后將圖像進(jìn)行兩兩匹配,可視化后如圖所示:


總結(jié)

匹配地理標(biāo)記圖像可視化的實(shí)驗(yàn)結(jié)果可以看出,匹配連接的順序大致正確,

SIFT算法的優(yōu)缺點(diǎn):

SIFT 算法在圖片的不變特征提取領(lǐng)域擁有非常大的優(yōu)點(diǎn),但仍存在個(gè)別缺點(diǎn):
實(shí)時(shí)性偏低,運(yùn)行速度不快
有些情況下特征點(diǎn)較少
對(duì)邊緣光滑的目標(biāo)圖片無法準(zhǔn)確提取特征點(diǎn)等缺點(diǎn)
對(duì)模糊的圖片和邊緣平滑的圖片,檢測(cè)出特征點(diǎn)過少

參考:
SIFT算法詳解:https://blog.csdn.net/zddblog/article/details/7521424

總結(jié)

以上是生活随笔為你收集整理的计算机视觉——SIFT算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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