SIFT特征匹配处理

1、SIFT特征原理描述

1.1 SIFT特性:

SIFT特征包括兴趣点的检测器和描述子,除了对于尺度,旋转和亮度具有不变性。还具有独特性,多量性,高速性和可扩展性。
独特性,也就是特征点可分辨性高,类似指纹,适合在海量数据中匹配。
多量性,提供的特征多。
高速性,就是速度快。
可扩展,能与其他特征向量联合使用。

1.2 SIFT特点:

旋转、缩放、平移不变性
解决图像仿射变换,投影变换的关键的匹配
光照影响小
目标遮挡影响小
噪声景物影响小

1.3 SIFT算法关键步骤:
1、尺度空间极值检测:

尺度空间,就相当于一个图片需要获得多少分辨率的量级。如果把一个图片从原始分辨率到,不停的对其分辨率进行减少,然后将这些图片摞在一起,可以看成一个四棱锥的样式,这个东西就叫做图像金字塔。在SIFT当中,利用了一个叫做高斯核的方程来构建尺度空间。构建尺度空间的目的是为了检测出在不同的尺度下都存在的特征点,如此可以获得缩放不变性。

2、关键点定位:

需要通过实现高斯金字塔的构造来实现关键点的求取。

3、关键点方向参数:

每个关键点设置方向以后可以获得旋转不变性。
获取关键点所在尺度空间的邻域,然后计算该区域的梯度和方向,根据计算得到的结果创建方向直方图,直方图的峰值为主方向的参数,其他高于主方向百分之80的方向被判定为辅助方向,这样设定对稳定性有很大帮助。

4、关键点描述符:

每个关键点有三个信息,位置、尺度、方向。所以具备平移、缩放、和旋转不变性。
接下来对每个关键点用一组向量将这个关键点描述出来,使其不随着光照、视角等等影响而改变。该描述符不但涉及关键点,而且还涉及到关键点周围的像素,使其有更强的不变特性。
基本原理是选取关键点周围16×16的像素区域,分成4个小块,每个小块创建8个bin的直方图,这总共的128个信息的向量就是关键点描述符的主要内容。此外还要测量,以达到光照、旋转的稳定性。

5、关键点匹配:

分别对模板图和实时图建立关键点描述符集合,通过对比关键点描述符来判断两个关键点是否相同。128个信息的向量使用欧氏距离来实现。

2、对两张图片进行SIFT特征匹配处理

from PIL import Image
from pylab import *
import sys
from PCV.localdescriptors import sift
 
 
if len(sys.argv) >= 3:
  im1f, im2f = sys.argv[1], sys.argv[2]
else:
#  im1f = '../data/sf_view1.jpg'
#  im2f = '../data/sf_view2.jpg'
  im1f = 'D:/picture/1.jpg'
  im2f = 'D:/picture/1.jpg'
#  im1f = '../data/climbing_1_small.jpg'
#  im2f = '../data/climbing_2_small.jpg'
im1 = array(Image.open(im1f))
im2 = array(Image.open(im2f))
 
sift.process_image(im1f, 'out_sift_1.txt')
l1, d1 = sift.read_features_from_file('out_sift_1.txt')
figure()
gray()
subplot(121)
sift.plot_features(im1, l1, circle=False)
 
sift.process_image(im2f, 'out_sift_2.txt')
l2, d2 = sift.read_features_from_file('out_sift_2.txt')
subplot(122)
sift.plot_features(im2, l2, circle=False)
 
#matches = sift.match(d1, d2)
matches = sift.match_twosided(d1, d2)
print ('{} matches'.format(len(matches.nonzero()[0])))
 
figure()
gray()
sift.plot_matches(im1, im2, l1, l2, matches, show_below=True)
show()

出现了错误如下:
SIFT特征匹配处理_第1张图片
我一开始一直以为是PCV出现了问题,其实只是因为python3的print要加括号,加上括号之后就可以解决问题啦。
另外还要补充的一点是你需要下载VLFeat,具体步骤参考这篇博文:https://blog.csdn.net/zhuxiaoyang2000/article/details/53930610
下载VLFeat
因为如果不下载这些你就会出现shif的问题,需要将shif.exevl.dll拷贝到当前目录下。
实验结果如图:
SIFT特征匹配处理_第2张图片
SIFT特征匹配处理_第3张图片

3、对从不同视点拍摄的图片做地理标记

# -*- coding: utf-8 -*-
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 = "panoimages"  # set this to the path where you downloaded the panoramio images
#path = "/FULLPATH/panoimages/"  # path to save thumbnails (pydot needs the full system path)

download_path = "D:/picture/1"  # set this to the path where you downloaded the panoramio images
path = "D:/picture/1"  # path to save thumbnails (pydot needs the full system path)

# list of downloaded filenames
imlist = imtools.get_imlist(download_path)
nbr_images = len(imlist)

# extract features
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 triangle
        print ('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 diagonal
        matchscores[j, i] = matchscores[i, j]

#可视化

threshold = 2  # min number of matches needed to create link

g = pydot.Dot(graph_type='graph')  # don't want the default directed graph

for i in range(nbr_images):
    for j in range(i + 1, nbr_images):
        if matchscores[i, j] > threshold:
            # first image in pair
            im = Image.open(imlist[i])
            im.thumbnail((100, 100))
            filename = path + str(i) + '.png'
            im.save(filename)  # need temporary files of the right size
            g.add_node(pydot.Node(str(i), fontcolor='transparent', shape='rectangle', image=filename))

            # second image in pair
            im = Image.open(imlist[j])
            im.thumbnail((100, 100))
            filename = path + str(j) + '.png'
            im.save(filename)  # need temporary files of the right size
            g.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')

出现了如下问题:
在这里插入图片描述
这个的解决办法就是直接在Anaconda Prompt命令行里面输入conda install pydot 就可以了。
除此之外还需要在命令行输入:conda install pydot-ng和conda install graphviz,下载完这两个,把图片路径改为绝对路径才可以运行。

运行结果:
SIFT特征匹配处理_第4张图片

你可能感兴趣的:(SIFT特征匹配处理)