Python实验二:SIFT特征原理及特征匹配

一、SIFT算法原理概述

 1、SIFT算法概述

  尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。 其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

  SIFT算法的实质可以归为在不同尺度空间上查找特征点(关键点)的问题。
Python实验二:SIFT特征原理及特征匹配_第1张图片

 2、SIFT算法步骤

   2.1、关键点检测
     搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
    2.1.1、尺度空间极值检测
    尺度空间理论的基本思想是:在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。

    尺度空间在实现时使用高斯金字塔表示
Python实验二:SIFT特征原理及特征匹配_第2张图片
高斯金字塔的构建分为两部分:
    1. 对图像做不同尺度的高斯模糊;
    2. 对图像做降采样(隔点采样)。

    2.1.1、DOG局部极值检测
    特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域
的相邻点大或者小中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
Python实验二:SIFT特征原理及特征匹配_第3张图片
    DOG方法不仅会对特别的局部图像块有极值响应,对于噪声和强边缘也同样会有响应。为了获得对于图像匹配和识别来说,更加稳定的局部图像块。SIFT中,还会对DOG的检测结果,进行后续处理。

  •      去除边缘效应
         由于DoG函数在图像边缘有较强的边缘响应,因此需要排除边缘响应。DoG函数的峰值点在边缘方向有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率可以通过计算在该点位置尺度的2×2的Hessian矩阵得到,导数由采样点相邻差来估计:
    Python实验二:SIFT特征原理及特征匹配_第4张图片
    D的主曲率和H的特征值成正比。令 α ,β为特征值,则
       在这里插入图片描述

该值在两特征值相等时达最小。Lowe论文中建议阈值T为1.2,即
  Python实验二:SIFT特征原理及特征匹配_第5张图片
   2.2、关键点方向匹配
     基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
     你确定关键点的方向采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。

   2.3、关键点描述
     在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

二、SIFT和Harris特征匹配处理实验结果对比

Python实验二:SIFT特征原理及特征匹配_第6张图片
--------------------------------------图2-1.SIFT特征匹配----------------------------------------

Python实验二:SIFT特征原理及特征匹配_第7张图片
-------------------------------------图2-2.Harris特征匹配---------------------------------------
  从理论上说,SIFT是一种相似不变量,即对图像尺度变化和旋转是不变量。然而,由于构造SIFT特征时,在很多细节上进行了特殊处理,使得SIFT对图像的复杂变形和光照变化具有了较强的适应性,同时运算速度比较快,定位精度比较高。如:
  在多尺度空间采用DOG算子检测关键点,相比传统的基于LOG算子的检测方法,运算速度大大加快;
  关键点的精确定位不仅提高了精度,而且大大提高了关键点的稳定性;
  在构造描述子时,以子区域的统计特性,而不是以单个像素作为研究对象,提高了对图像局部变形的适应能力.

三、匹配地理标记图像

Python实验二:SIFT特征原理及特征匹配_第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 = "D:/pic"  # set this to the path where you downloaded the panoramio images
path = "D:/pic"  # 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 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')

四、遇到问题

1、缩进问题Python实验二:SIFT特征原理及特征匹配_第9张图片
【解决过程】
  python要求很严格,注释、空格、或是对齐问题丢回导致你脚本报错!气skr人
2、环境配置

  • VLfeat配置
    下载网址:http://www.vlfeat.org/
    选择相应版本,这里我选择的是vlfeat-0.9.20-bin.tar.gz
    解压后,把文件夹里的sift.exe、vl.dll、vl.lib 拷到你所在的项目文件夹下
    Python实验二:SIFT特征原理及特征匹配_第10张图片
    3、python库pydot运行出现:FileNotFoundError:“dot.exe” not found in path在这里插入图片描述
    1.首先尝试在系统环境变量下将dot.exe路径添加进去
    2.还是不行的话,试试找到pydot的源码,在pydot.py中找到类Dot,修改self.prog = 'dot’为self.prog = ‘dot.exe’,之后测试。

参考博文:https://blog.csdn.net/lingyunxianhe/article/details/79063547
https://blog.csdn.net/sinat_38653840/article/details/84776806

你可能感兴趣的:(Python实验二:SIFT特征原理及特征匹配)