计算机视觉-Sift 特征提取

本文深入探讨SIFT(尺度不变特征转换)算法,包括其特点、实质和详细流程。从关键点检测、高斯金字塔、DOG空间极值检测到关键点方向分配和匹配,全面解析SIFT在图像处理中的应用。实验部分展示了SIFT在不同场景的特征提取和匹配效果,验证了其对旋转、尺度变化的不变性。同时,通过RANSAC算法剔除错误匹配,提高匹配精度。
摘要由CSDN通过智能技术生成

一、SIFT算法特点:

1、具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。
2、区分性好,能够在海量特征数据库中进行快速准确的区分信息进行匹配
3、多量性,就算只有单个物体,也能产生大量特征向量
4、高速性,能够快速的进行特征向量匹配
5、可扩展性,能够与其它形式的特征向量进行联合

二、SIFT算法实质

在不同的尺度空间上查找关键点,并计算出关键点的方向。
在这里插入图片描述
*

三、SIFT算法流程*

1、提取关键点:关键点是一些十分突出的不会因光照、尺度、旋转等因素而消失的点,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。此步骤是搜索所有尺度空间上的图像位置。通过高斯微分函数来识别潜在的具有尺度和旋转不变的兴趣点。
2、定位关键点并确定特征方向:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。然后基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
3. 通过各关键点的特征向量,进行两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。
**

四、关键点检测相关的概念

**

1.什么是特征点

这些点是一些十分突出的点不会因光照、尺度、旋转等因素的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。既然两幅图像中 有相同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间会有 相互对应的匹配点。
**

2.什么是尺度空间

尺度空间理论最早于1962年提出,其主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的空间表示。 从而实现边缘、角点检测和不同分辨率上的特征提取,以 满足特征点的尺度不变性。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标 在视网膜上的形成过程。尺度越大图像越模糊。SIFT算法在构建尺度空间时候采取高斯核函数进行滤波,使原始图像保存最多的细节特征,经过高斯滤波后细节特征逐渐减少来模拟大尺度情况下的特征表示。
利用高斯核函数进行滤波的主要原因有两个:
(1)高斯核函数是唯一的尺度不变核函数。
(2)DoG核函数可以近似为LoG函数,这样可以使特征提取更加简单。同时,David. Lowe作者在论文中提出将原始图像进行2倍上采样后滤波能够保留更多的信息便于后续特征提取与匹配。其实尺度空间图像生成就是当前图像与不同尺度核参数σ进行卷积运算后产生的图像。
SIFT算法在构建尺度空间时候采取高斯核函数进行滤波,使原始图像保存最多的细节特征,经过高斯滤波后细节特征逐渐减少来模拟大尺度情况下的特征表示。
利用高斯核函数进行滤波的主要原因有两个:
(1)高斯核函数是唯一的尺度不变核函数。
(2)DoG核函数可以近似为LoG函数,这样可以使特征提取更加简单。同时,David. Lowe作者在论文中提出将原始图像进行2倍上采样后滤波能够保留更多的信息便于后续特征提取与匹配。其实尺度空间图像生成就是当前图像与不同尺度核参数σ进行卷积运算后产生的图像。
2、表示
L(x, y, σ) ,定义为原始图像 I(x, y)与一个可变尺度的2维高斯函数G(x, y, σ) 卷积运算。
在这里插入图片描述
*表示卷积运算,(x,y)代表图像的像素位置。是尺度空间因子,值越小表示图像被平滑的越少,相应的尺度也就越小。大尺度对应于图像的概貌特征,小尺度对应于图像的细节特征。
**

五、高斯金字塔

**

1、概念

**
尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两步:
(1)对图像做高斯平滑;
(2)对图像做降采样。
在这里插入图片描述
图像的金字塔模型是指将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张图像),每个金字塔共n层。为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。如上图所示,将图像金字塔每层的一张图像使用不同参数做高斯模糊,Octave表示一幅图像可产生的图像组数,Interval表示一组图像包括的图像层数。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。
**

2.表示

高斯图像金字塔共o组、s层,则有
在这里插入图片描述

σ——尺度空间坐标; s——sub-level层坐标; σ0——初始尺度; S——每组层数(一般为3~5)

最后可将组内和组间尺度 归为:
在这里插入图片描述

i——金字塔组数 n——每一组的层数
**

六、DOG空间极值检测

**

1、DOG函数

在这里插入图片描述

2.DoG高斯差分金字塔

(1)对应DOG算子,需构建DOG金字塔
可以通过高斯差分图 像看出图像上的像素 值变化情况。如果 没有变化,也就没有特征。特征必须是变化尽可能多的点。 DOG图像描绘的是目 标的轮廓。
在这里插入图片描述
*(2)DOG局部极值检测 
DoG的局部极值点 特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点, 每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域 的相邻点大或者小。中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个 点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
在这里插入图片描述
(3)去除边缘响应
由于DoG函数在图像边缘有较强的边缘响应,因此需要排除边缘响应。 DoG函数的峰值点在边缘方向有较大的主曲率,而在垂直边缘的方向有 较小的主曲率。主曲率可以通过计算在该点位置尺度的2×2的Hessian矩 阵得到,导数由采样点相邻差来估计:
在这里插入图片描述

Dxx 表示DOG金字塔中某一尺度的图像x方向求导两次

D的主曲率和H的特征值成正比。令 α ,β为特征值,则
在这里插入图片描述

该值在两特征值相等时达最小。Lowe论文中建议阈值T为1.2,即
在这里插入图片描述

时保留关键点,反之剔除

七、关键点方向分配

通过尺度不变性求极值点,可以使其具有缩放不变的性质。而利 用关键点邻域像素的梯度方向分布特性,可以为每个关键点指定方向参数 方向,从而使描述子对图像旋转具有不变性。

通过求每个极值点的梯度来为极值点赋予方向。
**

1.像素点的梯度表示

在这里插入图片描述

梯度幅值: 在这里插入图片描述

梯度方向: 在这里插入图片描述

2.方向直方图的生成

确定关键点的方向采用梯度直方图统计法,统计以关键点为原 点,一定区域内的图像像素点对关键点方向生成所作的贡献。
在这里插入图片描述

3.关键点的主方向与辅方向

关键点主方向:极值点周围区域梯度直方图的主峰值也是特征点方向 • 关键点辅方向:在梯度方向直方图中,当存在另一个相当于主峰值 80%能量的峰值时,则将这个方向认为是该关键点的辅方向。 这可以增强匹配的鲁棒性,Lowe的论文指出大概有15%关键点具有 多方向,但这些点对匹配的稳定性至为关键。
在这里插入图片描述

七、关键点描述

对于每一个关键点,都拥有位置、尺度以及方向三个信息。为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
在这里插入图片描述
在这里插入图片描述

Lowe实验结果 表明:描述子 采用4×4×8= 128维向量表征, 综合效果最优 (不变性与独 特性)。

八、关键点匹配

关键点的匹配可以采用穷举法来完成,但是这样耗费的时间太多,一 般都采用kd树的数据结构来完成搜索。搜索的内容是以目标图像的关 键点为基准,搜索与目标图像的特征点最邻近的原图像特征点和次邻 近的原图像特征点。 Kd树是一个平衡二叉树
在这里插入图片描述

九、实验

1.对17张图片进行SIFT特征提取,并展示

(1)代码

# coding=UTF-8
from PIL import Image

from numpy import *

from pylab import *

import os


def process_image(imagename, resultname, params="--edge-thresh 10 --peak-thresh 5"):
    """ Process an image and save the results in a file. """

    if imagename[-3:] != 'pgm':
        # create a pgm file

        im = Image.open(imagename).convert('L')  # .convert('L') 将RGB图像转为灰度模式,灰度值范围[0,255]

        im.save('tmp.pgm')  # 将灰度值图像信息保存在.pgm文件中

        imagename = 'tmp.pgm'

    cmmd = str(r"C:\Users\86133\PycharmProjects\untitled\sift.exe " + imagename + " --output=" + resultname +

               " " + params)

    os.system(cmmd)  # 执行sift可执行程序,生成resultname(test.sift)文件

    print 'processed', imagename, 'to', resultname


def read_features_from_file(filename):
    """ Read feature properties and return in matrix form. """

    f = loadtxt(filename)

    return f[:, :4], f[:, 4:]  # feature locations, descriptors


def plot_features(im, locs, circle=True):
    """ Show image with features. input: im (image as array),

        locs (row, col, scale, orientation of each feature). """

    def draw_circle(c, r):

        t = arange(0, 1.01, .01) * 2 * pi

        x = 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')


if __name__ == '__main__':
    imname = ('D:\computervision-picture\school4.jpg')  # 待处理图像路径

    im = Image.open(imname)

    process_image(imname, 'test.sift')

    l1, d1 = read_features_from_file('test.sift')  # l1为兴趣点坐标、尺度和方位角度 l2是对应描述符的128 维向

    figure()

    gray()

    plot_features(im, l1, circle=True)

    title('sift-features')

    show()

(2)运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值