【计算机视觉】局部图像描述子
圖像特征匹配與地理標(biāo)記特征匹配
- 一、圖像特征匹配
- 1、圖像特征點(diǎn)匹配
- 2、Harris角點(diǎn)檢測
- 2.1角點(diǎn)介紹
- 2.2Harris算法介紹
- 2.3Harris角點(diǎn)響應(yīng)函數(shù)R
- 2.4Harris角點(diǎn)檢測代碼實(shí)現(xiàn)
- 2.5結(jié)果
- 2.6實(shí)驗(yàn)結(jié)論
- 3、SIFT特征提取與檢測
- 3.1SIFT算子介紹
- 3.2SIFT實(shí)現(xiàn)步驟簡述
- 3.3SIFT特征提取算法
- 3.4開源工具包VLFeat安裝
- 3.5SIFT特征提取與檢測代碼實(shí)現(xiàn)
- 3.6結(jié)果
- 3.7實(shí)驗(yàn)結(jié)論
- 二、地理標(biāo)記特征匹配
- 1、提取特征
- 1.1代碼
- 2、使用局部描述子匹配
- 2.1代碼
- 3、可視化連接圖像
- 3.1GraphViz、pydot安裝配置
- 3.2代碼
- 4、結(jié)果
- 5、分析與結(jié)論——SIFT優(yōu)缺點(diǎn)
- 三、問題
- 注意安裝順序
- 報(bào)錯
一、圖像特征匹配
1、圖像特征點(diǎn)匹配
(1)同名點(diǎn)
同一目標(biāo)點(diǎn)在不同像片上的構(gòu)像點(diǎn)。
(2)同名點(diǎn)匹配
是圖像拼接、三維重建、相機(jī)標(biāo)定等應(yīng)用的關(guān)鍵步驟。
(3)特征匹配的基本流程:
①找點(diǎn)(找到左右邊圖像中比較顯著的關(guān)鍵點(diǎn))
②為每個(gè)關(guān)鍵特征點(diǎn)打上一個(gè)標(biāo)簽即一個(gè)身份,用向量表示,向量稱為特征描述符
③有向量后,我們可以去右邊圖像中找到特征點(diǎn)看哪里與左邊圖像接近(找到匹配關(guān)系)
2、Harris角點(diǎn)檢測
2.1角點(diǎn)介紹
角點(diǎn):角點(diǎn)可以是兩條線的交叉處,也可以是位于相鄰的兩個(gè)主要方向不同的事物上的點(diǎn),即某方面特別突出的點(diǎn)。角點(diǎn)在保留圖像圖形重要特征的同時(shí),可以有效地減少信息的數(shù)據(jù)量,使其信息的含量很高,有效地提高了計(jì)算的速度,有利于圖像的可靠匹配。
如圖不同類型的角點(diǎn):
角點(diǎn)特征
①局部窗口沿各方面移動,均產(chǎn)生明顯變化的點(diǎn)
②圖像局部曲率突變的點(diǎn)
角點(diǎn)檢測算法如今可以歸納為3類:基于灰度圖像的角點(diǎn)檢測、基于二值圖像的角點(diǎn)檢測、基于輪廓曲線的角點(diǎn)檢測。
2.2Harris算法介紹
什么是好的角點(diǎn)檢測算法?
①檢測出圖像中“真實(shí)的”角點(diǎn)
②準(zhǔn)確的定位性能
③很高的穩(wěn)定性
④具有對噪聲的魯棒性
⑤具有較高的計(jì)算效率
Harris角點(diǎn)檢測:是特征點(diǎn)檢測的基礎(chǔ),提出了應(yīng)用鄰近像素點(diǎn)灰度差值概念,從而進(jìn)行判斷是否為角點(diǎn)、邊緣、平滑區(qū)域。
Harris角點(diǎn)檢測原理:是利用移動的窗口在圖像中計(jì)算灰度變化值,其中關(guān)鍵流程包括轉(zhuǎn)化為灰度圖像、計(jì)算差分圖像、高斯平滑、計(jì)算局部極值、確認(rèn)角點(diǎn)。
Harris角點(diǎn)檢測基本思想:
在窗口任意方向移動角點(diǎn)的圖像灰度都會發(fā)生明顯變化;
邊緣區(qū)域只有在左右移動時(shí)變化明顯,上下移動無變化;
平坦區(qū)域任意方向移動都無變化。如下圖分別為平坦區(qū)域,邊緣區(qū)域和角點(diǎn)時(shí)的變化情況。
Harris角點(diǎn)數(shù)學(xué)表達(dá):
將圖像窗口平移[u,v]產(chǎn)生灰度變化E(u,v)
通過一元和二元泰勒產(chǎn)開后:
對于局部微小的移動量[u,v],可以近似得到下面的表達(dá):
其中M是2*2的矩陣,可由圖像的導(dǎo)數(shù)求得:
2.3Harris角點(diǎn)響應(yīng)函數(shù)R
①矩陣M,將其對角化之后,特征值λ1, λ2 分別代表了X 和Y 方向的灰度變化率:
②通過M的兩個(gè)特征值λ1, λ2的大小對圖像點(diǎn)進(jìn)行分類:
如圖所示:
如果λ1, λ2都很小, 圖像窗口在所有方向上移動都無明顯灰度變化。
如果λ1, λ2都很大, 圖像窗口在所有方向上移動都產(chǎn)生明顯灰度變化。
③定義:角點(diǎn)響應(yīng)函數(shù)R:
R只與M的特征值有關(guān):
在角點(diǎn)豐富的圖中:R值為正值,因?yàn)榻屈c(diǎn)豐富的圖入1入2值都較大即detM值大,則R值大。
在平坦的圖中:R值為小數(shù)值,且平坦的圖中含有邊緣,因此R值也有負(fù)數(shù)值;因?yàn)樵谄教沟膱D中,入1入2值都很小,所以R值小。
在邊緣豐富的圖中:入1和入2的值一方大一方小,所以R值為大值負(fù)數(shù)。
④角點(diǎn)響應(yīng)函數(shù)R對于旋轉(zhuǎn)具有不變性
對于圖像的灰度變化具有部分不變性
對于圖像尺度變化不具有不變性
2.4Harris角點(diǎn)檢測代碼實(shí)現(xiàn)
# -*- coding: utf-8 -*- from pylab import * from PIL import Image from PCV.localdescriptors import harris""" Example of detecting Harris corner points (Figure 2-1 in the book). """# 讀入圖像 im = array(Image.open(r'C:\Users\ltt\Documents\Subjects\大三下\計(jì)算機(jī)視覺(蔡國榕)\第二章\Cap2\1\gq.jpg').convert('L'))# 檢測harris角點(diǎn) harrisim = harris.compute_harris_response(im)# Harris響應(yīng)函數(shù) harrisim1 = 255 - harrisimfigure() gray()#畫出Harris響應(yīng)圖 subplot(141) imshow(harrisim1) print (harrisim1.shape) axis('off') axis('equal')threshold = [0.01, 0.05, 0.1] for i, thres in enumerate(threshold):filtered_coords = harris.get_harris_points(harrisim, 6, thres)subplot(1, 4, i+2)imshow(im)print(im.shape)plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')axis('off')show()2.5結(jié)果
原圖:
實(shí)驗(yàn)結(jié)果:
結(jié)論:
①該代碼先代入一幅圖像,將其轉(zhuǎn)換成灰度圖像,然后計(jì)算相響應(yīng)函數(shù),通過響應(yīng)值選擇角點(diǎn)。最后,將這些檢測的角點(diǎn)在原圖上顯示出來。
②本次實(shí)驗(yàn)中,角點(diǎn)較多的區(qū)域是目標(biāo)的輪廓和色彩比較深的區(qū)域。
2.6實(shí)驗(yàn)結(jié)論
增大threshold的值,將減小角點(diǎn)響應(yīng)值R RR,降低角點(diǎn)檢測的靈性,減少被檢測角點(diǎn)的數(shù)量;減小threshold值,將增大角點(diǎn)響應(yīng)值R RR,增加角點(diǎn)檢測的靈敏性,增加被檢測角點(diǎn)的數(shù)量。
Harris算法的主要特點(diǎn)是閾值決定檢測點(diǎn)數(shù)量;
角點(diǎn)檢測算子對亮度和對比度的變化不敏感;
具有旋轉(zhuǎn)不變性,不具有尺度不變性;
harris算法中的閾值依賴于實(shí)際圖像的屬性,不具有直觀的物理意義,具體值難確定。
3、SIFT特征提取與檢測
3.1SIFT算子介紹
在之前的學(xué)習(xí)中,我們學(xué)習(xí)了角點(diǎn)的基本知識,并對Harris角點(diǎn)檢測算法應(yīng)用到了圖像的角點(diǎn)檢測。
當(dāng)我們在觀察圖像中的物體時(shí),物體所在的圖像不論背景或者角度如何變換,我們依然能很快的識別出圖像中的目標(biāo)物體。對機(jī)器來說,則需要定義圖像上的關(guān)鍵特征并且能夠根據(jù)這些特征搜索到一張新的圖片。
SIFT,即尺度不變特征變換(Scale-invariant feature transform,SIFT)。是在計(jì)算機(jī)視覺任務(wù)中特征提取算法。
3.2SIFT實(shí)現(xiàn)步驟簡述
SIFT算法的實(shí)質(zhì)可以歸為在不同尺度空間上查找特征點(diǎn)(關(guān)鍵點(diǎn))的問題。SIFT算法實(shí)現(xiàn)特征匹配主要有三個(gè)流程:
a.提取關(guān)鍵點(diǎn);
b.對關(guān)鍵點(diǎn)附加詳細(xì)的信息(局部特征),即描述符;
c.通過特征點(diǎn)(附帶上特征向量的關(guān)鍵點(diǎn))的兩兩比較找出相互匹配的若干對特征點(diǎn),建立景物間的對應(yīng)關(guān)系。
3.3SIFT特征提取算法
①構(gòu)建尺度空間,檢測極值點(diǎn),獲得尺度不變性
-
構(gòu)建尺度空間——特征點(diǎn)的性質(zhì)之一就是對尺度的變化保持不變性。因此尋找的特征點(diǎn)要在不同尺度下都能被檢測出來.根據(jù)文獻(xiàn)可知,變換到尺度空間唯一的核函數(shù)是高斯函數(shù)。因此一個(gè)圖像的尺度空間定義為:L( x,y,σ)是由可變尺度的高斯函數(shù)G(x,y,σ) 與輸入圖像I(x,y卷積得到
即:?L(x,y,σ)=G(x,y,σ)?I(x,y)
( x , y )是尺度坐標(biāo),σ大小決定圖像的平滑程度,大尺度對應(yīng)圖像的概括特征,小尺度對應(yīng)圖像的細(xì)節(jié)特征,大的σ對應(yīng)粗糙尺度(低分辨率),小σ對應(yīng)高分辨率。為使計(jì)算相對高效,真正使用的是差分高斯尺度空間
D(x,y,σ): -
高斯模糊——降低圖像中的噪點(diǎn),強(qiáng)調(diào)了圖像的重要特征。進(jìn)行高斯模糊之和,紋理和次要細(xì)節(jié)將從圖像中刪除,并且保留形狀和邊緣之類的相關(guān)信息。
-
實(shí)現(xiàn)DOG——初始圖像與不同σ值的高斯函數(shù)卷積,得到一垛模糊后圖像,然后將這一垛圖像臨近兩兩相減得到對應(yīng)的DOG。一副圖像可以產(chǎn)生幾組圖像,一組圖像包括幾層圖像。s為每組層數(shù)一般為3~5層,最后可以將s和k的關(guān)系確立為k=2^(1/s)
-
尺度空間檢測極值點(diǎn)——DOG上某個(gè)像素要和本尺度的8個(gè)像素以及上下相鄰尺度各9個(gè)相鄰像素共26個(gè)像素值進(jìn)行比較,以確定是否為局部最大或最小值。如果它是相鄰像素中最高或者最低的像素,則確定該像素點(diǎn)是尺度空間的極值點(diǎn)之一。
②篩選關(guān)鍵點(diǎn),剔除不穩(wěn)定的極值點(diǎn)
去掉對比度低的以及處于不理想邊緣處的關(guān)鍵點(diǎn),得到符合要求的特征關(guān)鍵點(diǎn)。
③在特征點(diǎn)處提取特征描述符,為特征點(diǎn)分配方向值
確定關(guān)鍵點(diǎn)的方向采用梯度直方圖統(tǒng)計(jì)法,統(tǒng)計(jì)以關(guān)鍵點(diǎn)為原 點(diǎn),一定區(qū)域內(nèi)的圖像像素點(diǎn)對關(guān)鍵點(diǎn)方向生成所作的貢獻(xiàn)。
④生成特征描述符,利用特征描述符尋找匹配特征點(diǎn)
下圖是一個(gè)SIFT描述子事例。其中描述子由2×2×8維向量表征,也即是
2×2個(gè)8方向的方向直方圖組成。左圖的種子點(diǎn)由8×8單元組成。每一個(gè)小格
都代表了特征點(diǎn)鄰域所在的尺度空間的一個(gè)像素,箭頭方向代表了像素梯度方
向,箭頭長度代表該像素的幅值。然后在4×4的窗口內(nèi)計(jì)算8個(gè)方向的梯度方
向直方圖。繪制每個(gè)梯度方向的累加可形成一個(gè)種子點(diǎn),如右圖所示:一個(gè)特
征點(diǎn)由4個(gè)種子點(diǎn)的信息所組成。
⑤關(guān)鍵點(diǎn)匹配
為了對這些特征點(diǎn)進(jìn)行匹配,需要對這些特征點(diǎn)運(yùn)用適當(dāng)?shù)谋容^方法來找到相應(yīng)關(guān)系。
特征點(diǎn)的匹配可以采用窮舉法來完成,但是這樣耗費(fèi)的時(shí)間太多,一 般都采用kd樹的數(shù)據(jù)結(jié)構(gòu)來完成搜索。搜索的內(nèi)容是以目標(biāo)圖像的特征點(diǎn)為基準(zhǔn),搜索與目標(biāo)圖像的特征點(diǎn)最鄰近的原圖像特征點(diǎn)和次鄰 近的原圖像特征點(diǎn)。
3.4開源工具包VLFeat安裝
為了計(jì)算圖像的SIFT特征,我們用開源工具包VLFeat。用Python重新實(shí)現(xiàn)SIFT特征提取的全過程不會很高效。VLFeat可以在www.vlfeat.org上下載,它的二進(jìn)制文件可以用于一些主要的平臺。這個(gè)庫是用C寫的,不過我們可以利用它的命令行接口。此外,它還有Matlab接口。
3.5SIFT特征提取與檢測代碼實(shí)現(xiàn)
from pylab import * from PIL import Image from numpy import * import osdef 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(r"C:\Users\ltt\Documents\Subjects\大三下\計(jì)算機(jī)視覺(蔡國榕)\win64vlfeat\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):"""對于第一幅圖像的每個(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]# 去除不對稱匹配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)def plot_matches(im1, im2, locs1, locs2, matchscores, show_below=True):"""顯示一幅帶有連接匹配之間連線的圖片輸入:im1,im2(數(shù)組圖像),locs1,locs2(特征位置),matchscores(match的輸出),show_below(如果圖像應(yīng)該顯示再匹配下方)"""im3 = appendimages(im1,im2)if show_below:im3 = vstack((im3,im3))imshow(im3)cols1 = im1.shape[1]for i in range(len(matchscores)):if matchscores[i] > 0:plot([locs1[i, 0], locs2[matchscores[i, 0], 0] + cols1], [locs1[i, 1], locs2[matchscores[i, 0], 1]], 'c')axis('off')if __name__ == '__main__':# imname = 'raccoon.jpg'# im1 = array(Image.open(imname).convert('L'))# process_image(imname, 'raccoon.sift')# l1, d1 = read_features_from_file('raccoon.sift')## figure()# gray()# plot_features(im1, l1, circle=True)# show()im1f = r'C:/Users/ltt/Documents/Subjects/大三下/計(jì)算機(jī)視覺(蔡國榕)/第二章/Cap2/1/gq.jpg'im2f = r'C:/Users/ltt/Documents/Subjects/大三下/計(jì)算機(jī)視覺(蔡國榕)/第二章/Cap2/1/gq.jpg'im1 = array(Image.open(im1f))im2 = array(Image.open(im2f))process_image(im1f, 'out_sift_1.txt')l1, d1 = read_features_from_file('out_sift_1.txt')figure()gray()subplot(121)plot_features(im1, l1, circle=False)process_image(im2f, 'out_sift_2.txt')l2, d2 = read_features_from_file('out_sift_2.txt')subplot(122)plot_features(im2, l2, circle=False)matches = match_twosided(d1, d2)print('{} matches'.format(len(matches.nonzero()[0])))figure()gray()plot_matches(im1, im2, l1, l2, matches, show_below=True)show()3.6結(jié)果
原圖:
library1:
library2:
實(shí)驗(yàn)結(jié)果:
結(jié)論:
- 通過實(shí)驗(yàn)發(fā)現(xiàn)Harris角點(diǎn)的匹配數(shù)很多,SIFT匹配點(diǎn)數(shù)量少一些。
- SIFT匹配點(diǎn)因?yàn)橛型ㄟ^當(dāng)兩幅圖像的SIFT特征向量生成后,下一步我們采用關(guān)鍵點(diǎn)特征向量的歐式距離來作為兩幅圖像中關(guān)鍵點(diǎn)的相似性判定度量。取圖像1中的某個(gè)關(guān)鍵點(diǎn),并找出其與圖像2中歐式距離最近的前兩個(gè)關(guān)鍵點(diǎn),在這兩個(gè)關(guān)鍵點(diǎn)中,如果最近的距離除以次近的距離少于某個(gè)比例閾值,則接受這一對匹配點(diǎn)。降低這個(gè)比例閾值,SIFT匹配點(diǎn)數(shù)目會減少,但更加穩(wěn)定。
3.7實(shí)驗(yàn)結(jié)論
- SIFT特征檢索是基于內(nèi)容的圖像檢索技術(shù)是基于圖像自身的內(nèi)容特征來檢索圖像,這免去人為標(biāo)注圖像的過程。基于內(nèi)容的圖像檢索技術(shù)是采用某種算法來提取圖像中的特征(SIFT,SURF,CNN等),并將特征存儲起來,組成圖像特征數(shù)據(jù)庫。當(dāng)需要檢索圖像時(shí),采用相同的特征提取技術(shù)提取出待檢索圖像的特征,并根據(jù)某種相似性準(zhǔn)則計(jì)算得到特征數(shù)據(jù)庫中圖像與待檢索圖像的相關(guān)度,最后通過由大到小排序,得到與待檢索圖像最相關(guān)的圖像,實(shí)現(xiàn)圖像檢索。
- SIFT算法是提取特征的一個(gè)重要算法,該算法對圖像的扭曲,光照變化,視角變化,尺度旋轉(zhuǎn)都具有不變性。
二、地理標(biāo)記特征匹配
1、提取特征
先對圖像使用SIFT特征提取代碼進(jìn)行處理,并且將特征保存在和圖像同名(但文件名是.sift,而不是.jpg)的文件路徑下。
1.1代碼
download_path = r"C:\Users\ltt\Documents\Subjects\大三下\計(jì)算機(jī)視覺(蔡國榕)\第二章\data"path = r"C:\Users\ltt\Documents\Subjects\大三下\計(jì)算機(jī)視覺(蔡國榕)\第二章\data"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])2、使用局部描述子匹配
我們可以對所有的組合圖像進(jìn)行逐個(gè)匹配,我們將每對圖像間的匹配特征數(shù)保存在matchscores數(shù)組中。
2.1代碼
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# copy valuesfor i in range(nbr_images):for j in range(i + 1, nbr_images): # no need to copy diagonalmatchscores[j, i] = matchscores[i, j]3、可視化連接圖像
我們會用到pydot工具包,該工具包要需要用到GraphViz,先去官網(wǎng)下載安裝即可graphviz。注意記得安裝路徑,下載后需要添加環(huán)境變量。配置后在命令行輸入dot -version,查看graphviz是否安裝成功。
3.1GraphViz、pydot安裝配置
可視化連接圖像需要構(gòu)建線條對圖片進(jìn)行相連操作,而pydot工具包提供了GraphViz graphing庫的Python接口,可以實(shí)現(xiàn)連接可視化。
在Windows系統(tǒng)上安裝配置Graphviz:
-
首先下載安裝包graphviz-2.38.msi,下載地址為https://graphviz.gitlab.io/_pages/Download/Download_windows.html
-
雙擊msi文件,然后一直選擇next(默認(rèn)安裝路徑為C:\Program Files(x86)\Graphviz2.38\),安裝完成之后,會在windows開始菜單創(chuàng)建快捷信息。
-
配置環(huán)境變量:計(jì)算機(jī)→屬性→高級系統(tǒng)設(shè)置→高級→環(huán)境變量→系統(tǒng)變量→path,在path中加入路徑:C:\Program Files(x86)\Graphviz2.38\bin
-
驗(yàn)證:在windows命令行界面,輸入dot
-version,然后按回車,如果顯示如下圖所示的graphviz相關(guān)版本信息,則安裝配置成功。
成功后直接在命令行中pip pydot和graphviz
3.2代碼
# 可視化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) + '.jpg'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) + '.jpg'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_jpg('tt.jpg')4、結(jié)果
原圖:
運(yùn)行結(jié)果:
(圖片過大容易發(fā)生過多索引的錯誤,并且過大也會運(yùn)行很久,建議圖像都壓縮一下)
5、分析與結(jié)論——SIFT優(yōu)缺點(diǎn)
- 實(shí)驗(yàn)放置了三組圖像:尚大樓,延奎圖書館,亭子,皆為不同視角所拍攝。
- 實(shí)驗(yàn)測試了13張圖片,最終只有9張圖片可以被匹配出來。這是因?yàn)樵诖a中,我們設(shè)置了閾值theshhod=2,但是有些圖片的特征點(diǎn)匹配數(shù)量不超過2個(gè),因此無法匹配顯示出來。
- 此圖中l(wèi)ibrary3.jpg為較遠(yuǎn)視角時(shí)所拍攝,且有其他建筑物影響,但是SIFT算法依舊可以進(jìn)行準(zhǔn)確的匹配,說明SIFT算法在地理建筑匹配中的確有很大的優(yōu)勢。【優(yōu)點(diǎn)】
- 盡管SIFT算法進(jìn)行地理特征匹配有很大優(yōu)勢,且對于不同的視角的圖像用SIFT算法可以進(jìn)行很好的匹配,但是圖中的jmu04.jpg依舊沒有被識別匹配出來,所以SIFT并不是完美的,角度旋轉(zhuǎn)過多,導(dǎo)致目標(biāo)匹配的特征點(diǎn)消失,因此無法被識別從而匹配。【缺點(diǎn)】
三、問題
注意安裝順序
1.我們需要先下載安裝graphviz
2.配置環(huán)境變量
3.在cmd后輸入pip install pydot進(jìn)行pydot的安裝下載。
報(bào)錯
1.OSError: XXXX.sift not found
此時(shí)需要檢查系統(tǒng)中各個(gè)包是否導(dǎo)入,路徑是否正確。
- 檢查PCV的sift.py文件中cmmd處路徑是否已經(jīng)換成自己項(xiàng)目中的【sift.exe】文件路徑。注意路徑末尾(引號前)留一個(gè)空格
- 檢查pydot和graphviz是否導(dǎo)入且路徑是否正確,可以直接在pycharm的左下角terminal處dot
-version看是否導(dǎo)入成功或者查看pycharm->file->settings->Project->Project Interpreter看pydot等是否存在。 - 若檢查發(fā)現(xiàn)問題依舊解決不了,點(diǎn)開pycharm->file->settings->Project->Project
Interpreter,點(diǎn)擊右側(cè)加號,搜索pydot等進(jìn)行安裝。 - 如果發(fā)現(xiàn)代碼沒錯,配置也都沒錯,但是結(jié)果始終報(bào)錯,那就是玄學(xué)問題了,博主只能說聽天由命吧!(一開始pycharm始終查不到錯,便抱著試試的心態(tài)在命令行運(yùn)行了代碼,結(jié)果成功運(yùn)行出來之后,本人的pycharm居然奇跡般地自己好了,運(yùn)行也可以運(yùn)行,錯誤也不報(bào)了!)
2.too many indices for array
- 同(1)中解決辦法,一切都配置確認(rèn)無誤之后,檢查圖片大小,如果圖片太大,索引太多會超出范圍且運(yùn)行速度也會十分的慢,可以修改每張圖片的大小進(jìn)行壓縮。
總結(jié)
以上是生活随笔為你收集整理的【计算机视觉】局部图像描述子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对Web登录全面认识
- 下一篇: 03.运算符和if选择结构