计算机视觉学习(二)——sift特征检测+匹配地理标记图像

知识点概念这里就不多说了。。。

 

SIFT特征点检测

代码:

 1 import sift
 2 from PIL import Image
 3 from pylab import *
 4 imname = 'test/3.jpg'
 5 im1 = array(Image.open(imname).convert('L'))
 6 sift.process_image(imname,'3.sift')
 7 l1,d1 = sift.read_features_from_file('3.sift')
 8 figure()
 9 gray()
10 sift.plot_features(im1,l1,circle=False)
11 show()

 输入一张图片,使用sift算法进行特征点检测,运行图如下:

 

 

SIFT特征匹配

代码:

 1 from PIL import Image
 2 from pylab import *
 3 from numpy import *
 4 import sift
 5 from pcv.localdescriptors import sift
 6 im1f = 'test/3.jpg'
 7 im2f = 'test/4.jpg'
 8 im1 = array(Image.open(im1f))
 9 im2 = array(Image.open(im2f))
10 
11 sift.process_image(im1f,'out_sift_1.txt')
12 l1,d1=sift.read_features_from_file('out_sift_1.txt')
13 figure()
14 gray()
15 subplot(121)
16 sift.plot_features(im1,l1,circle=False)
17 
18 sift.process_image(im2f,'out_sift_2.txt')
19 l2,d2=sift.read_features_from_file('out_sift_2.txt')
20 subplot(122)
21 sift.plot_features(im2,l2,circle=False)
22 
23 matches = sift.match_twosided(d1,d2)
24 print('{} matches'.format(len(matches.nonzero()[0])))
25 figure()
26 gray()
27 sift.plot_matches(im1,im1,l1,l2,matches, show_below=True)
28 show()

 输入两张图片,分别进行特征点检测,将检测数据存储到文本文件中,将二者进行比较使用match_twosided方法匹配相同特征,运行图如下,得到matches=100

 

 

匹配地理标记图像:

代码:

 1 import json
 2 import os
 3 import urllib
 4 from pylab import *
 5 from PIL import Image
 6 from pcv.localdescriptors import sift
 7 from pcv.tools import imtools
 8 import pydot
 9 download_path = "D:/Python/Python39/Scripts/计算机视觉/test"  # 注意使用绝对路径'/'
10 path = "D:/Python/Python39/Scripts/计算机视觉/test"
11  
12 imlist = imtools.get_imlist(download_path)
13 nbr_images = len(imlist)
14  
15 featlist = [imname[:-3] + 'sift' for imname in imlist]
16 for i, imname in enumerate(imlist):
17     sift.process_image(imname, featlist[i])
18 
19 matchscores = zeros((nbr_images, nbr_images))
20  
21 for i in range(nbr_images):
22     for j in range(i, nbr_images): #only compute upper triangle
23         print( 'comparing ', imlist[i], imlist[j])
24         l1, d1 = sift.read_features_from_file(featlist[i])
25         l2, d2 = sift.read_features_from_file(featlist[j])
26         matches = sift.match_twosided(d1, d2)
27         nbr_matches = sum(matches>0)
28         print('number of matches = ', nbr_matches)
29         matchscores[i,j] = nbr_matches
30 
31 # copy values
32 for i in range(nbr_images):
33     for j in range(i + 1, nbr_images): # no need to copy diagonal
34         matchscores[j, i] = matchscores[i, j]
35 
36 # 可视化
37 threshold = 2 # min number of matches needed to craete link
38  
39 g = pydot.Dot(graph_type='graph') # don't want the default directed graph
40  
41 for i in range(nbr_images):
42     for j in range(i+1, nbr_images):
43         if matchscores[i,j] > threshold:
44             #图像对中的第一幅图像
45             im = Image.open(imlist[i])
46             im.thumbnail((100,100))
47             filename = path + str(i) + '.png'
48             im.save(filename) #需要一定大小的临时文件
49             g.add_node(pydot.Node(str(i), fontcolor='transparent',
50                        shape='rectangle', image=filename))
51  
52             #图像对中的第二幅图像
53             im = Image.open(imlist[j])
54             im.thumbnail((100,100))
55             filename = path + str(j) + '.png'
56             im.save(filename) #需要一定大小的临时文件
57             g.add_node(pydot.Node(str(j), fontcolor='transparent',
58                        shape='rectangle', image=filename))
59             g.add_edge(pydot.Edge(str(i), str(j)))
60 g.write_png('compare.png')

输入一组图片,将所有图片的特征点保存到同名的后缀.sift文件中,通过循环将文件的特征数值两两比较,通过可视化包设置达到最小数值thresold=2,将两张图片进行连线,运行图如下:

 

1.jpg和2.jpg共有56个匹配点;
3.jpg有964个特征点,和4.jpg共有100个匹配点;
5.jpg有773个特征点,和6.jpg共有12个匹配点,和7共有3个匹配点,和8共有590个匹配点
6.jpg有668个特征点,和7.jpg共有3个匹配点,和8共有8个匹配点
10.jpg有2916个特征点,和9.jpg共有11个匹配点,和11共有15个匹配点;
11.jpg有1896个特征点,和9.jpg共有8个匹配点

 

 

工具包使用问题:

  图片需要压缩小点否则程序要跑很久,尽量保证图片像素高宽比一致

  从网上下载安装pcv包(pip install pcv)调用,然后需要下载降级二进制处理文件vlfeat-0.9.20版本,下载完成后找到\bin\win64\下的sift.exe和vl.dll文件复制到你的项目底下,修改pcv路径(python/lib/pcv/localdescriptors)底下sift.py文件process_image方法底下print后面加括号

  若出现'dot' not found问题,还需要下载graphviz,找到bin目录底下dot.exe路径,修改python/lib/site-packages/pydot.py中_inif_方法下代码为 self.prog = r'路径\bin\dot.exe'

 

这里给了超链接下载,具体安装方法参考网上教程,具体代码可以参考书本代码《python计算机视觉编程》

 

 

以上图片来源集美大学实拍建筑(嘉庚图书馆侧门,陈延奎图书馆,嘉庚湖畔勿忘亭,集美大学东大门) 

 

分割线


3/27

3/28更新


 https://blog.csdn.net/weixin_43968441/article/details/115271968

posted @ 2021-03-27 21:12  Easy-  阅读(503)  评论(0)    收藏  举报