精华内容
下载资源
问答
  • sift特征匹配算法

    2018-04-18 21:18:51
    图像特征匹配已成为计算机视觉和数字图像处理等领域的研究热点,其首要 任务是从待匹配的图像中提取含有图像特征特征点并进行描述,通过建立原图 像和待匹配图像的特征点集之间的点点对应关系,计算对应点之间的...
  • 代码亲测好用,可以提取两幅图像的同名点,并且可以筛选,筛选后精度很高,可用于两幅图像配准,拼接为一副整图像,拼接的效果很好。可以在main函数直接使用,便会调用所用函数,使用很方便。而且代码注释很仔细,...
  • 论文提出一种基于SIFT(Scale Invariant Feature Transform) 特征匹配的运动目标检测和跟踪算法。在目标检测阶段,首先提取两帧带检测图像的SIFT特征点并进行特征匹配,然后计算两帧图像之间的几何变换矩阵,从而...
  • SIFT特征匹配算法及代码(python)

    万次阅读 多人点赞 2019-03-18 00:50:15
    本文主要讲解SIFT特征点的提取及匹配的原理,并与Harris角点检测器进行对比,比较算法优良性。本文还有一个用局部描述子对地理标记图像进行匹配的例子,并对匹配后的图像进行连接可视化(运用了pydot的工具包)。 1...

    本文主要讲解SIFT特征点的提取及匹配的原理,并与Harris角点检测器进行对比,比较算法优良性。本文还有一个用局部描述子对地理标记图像进行匹配的例子,并对匹配后的图像进行连接可视化(运用了pydot的工具包)。

    1. SIFT(尺度不变特征变换)

    David Lowe提出的SIFT(Scale-Invariant Feature Transform)是最成功的图像局部描述子之一。SIFT特征包括兴趣点检测器和描述子,其中SIFT描述子具有非常强的稳健性,这在很大程度上也是SIFT特征能够成功和流行的主要原因。SIFT特征对于尺度、旋转、亮度都具有不变性,下面会详细介绍其原理。

    1.1 尺度空间的构建

    图像的尺度空间是这幅图像在不同解析度下的表示。一幅图像可以产生几组(octave)图像,一组图像包括几层图像。构造尺度空间传统的方法即构造一个高斯金字塔,原始图像作为最底层,然后对图像进行高斯模糊再降采样(2倍)作为下一层图像(即尺度越大,图像越模糊),循环迭代下去。
    在这里插入图片描述
    对图像进行尺度变换,以满足特征点的尺度不变性,保留图像轮廓和细节。

    1.1.1 DOG算子

    DoG(Difference of Gaussian)函数:
    在这里插入图片描述
    在这里插入图片描述
    该函数在计算上只需相邻高斯平滑后图像相减,因此简化了计算。

    1.1.2 DoG高斯差分金字塔

    对应DOG算子,需构建DOG金字塔。
    在这里插入图片描述
    可以通过高斯差分图像看出图像上的像素值变化情况。(如果没有变化,也就没有特征。特征必须是变化尽可能多的点。)DOG图像描绘的是目标的轮廓。
    在这里插入图片描述
    从图像中可看出越位于金字塔上层(差分越大)图像越模糊,但能得到图像的轮廓;反之,越处于金字塔底端(差分越小)图像的细节就越清晰。即保留了图像的轮廓和细节。

    1.2 选定关键点

    1.2.1 局部极值点

    特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如下图中检测特征点与自身尺度层中其余8个点和在其之上及之下的两个尺度层9个点进行比较,共26个点,图中标记‘x’的像素点的特征值若大于周围像素则可确定该点为该区域的特征点。
    在这里插入图片描述

    1.2.2 去除边缘响应点

    由于DoG函数在图像边缘有较强的边缘响应,因此需要排除边缘响应。DoG函数的峰值点在边缘方向有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率可以通过计算在该点位置尺度的2×2的Hessian矩阵得到,导数由采样点相邻差来估计:
    在这里插入图片描述
    Dxx 表示DOG金字塔中某一尺度的图像x方向求导两次。
    D的主曲率和H的特征值成正比。令 α ,β为特征,则
    在这里插入图片描述
    该值在两特征值相等时达最小。Lowe论文中建议阈值T为1.2,即
    在这里插入图片描述时保留关键点,反之剔除。

    1.3 关键点方向分配

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

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

    1.3.1 方向直方图的生成

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

    1.3.2 关键点的主方向与辅方向

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

    1.4 生成特征点描述子

    下图是一个SIFT描述子事例。其中描述子由2×2×8维向量表征,也即是2×2个8方向的方向直方图组成。左图的种子点由8×8单元组成。每一个小格都代表了特征点邻域所在的尺度空间的一个像素,箭头方向代表了像素梯度方向,箭头长度代表该像素的幅值。然后在4×4的窗口内计算8个方向的梯度方向直方图。绘制每个梯度方向的累加可形成一个种子点,如右图所示:一个特征点由4个种子点的信息所组成。
    在这里插入图片描述
    在这里插入图片描述
    Lowe实验结果表明:描述子采用4×4×8=128维向量表征,综合效果最优(不变性与独特性)。

    1.5 关键点匹配

    分别对模板图(参考图,reference image)和实时图(观测图,observation image)建立关键点描述子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。欧氏距离越短,代表两个特征点的匹配度越好。
    在这里插入图片描述在这里插入图片描述
    关键点的匹配可以采用穷举法来完成,但是这样耗费的时间太多,一般都采用kd树的数据结构来完成搜索。搜索的内容是以目标图像的关键点为基准,搜索与目标图像的特征点最邻近的原图像特征点和次邻近的原图像特征点。
    在这里插入图片描述

    1.6 代码及其运行结果

    下面给出算法的主要代码,及与Harris角点检测算法的比对结果。

    1.6.1 代码

    为了计算图像的SIFT特征,我们需要用到开源工具包VLFeat。VLFeat的下载地址:www.vlfeat.org(运用该工具包的过程中可能会出现一些问题,详细的解决方法下次再另说。)

    #SIFT算法
    from PIL import Image
    from pylab import *
    import sys
    from PCV.localdescriptors import sift
    
    im1f = 'C:/Users/ace/Pictures/ims/17.jpg'
    im2f = 'C:/Users/ace/Pictures/ims/18.jpg'
    im1 = array(Image.open(im1f).convert('L'))
    im2 = array(Image.open(im2f).convert('L'))
    
    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()
    

    运行结果:
    在这里插入图片描述在这里插入图片描述

    #Harris算法
    from pylab import *
    from PIL import Image
    from PCV.localdescriptors import harris
    from PCV.tools.imtools import imresize
    
    im1 = array(Image.open("C:/Users/ace/Pictures/ims/17.jpg").convert("L"))
    im2 = array(Image.open("C:/Users/ace/Pictures/ims/18.jpg").convert("L"))
    
    wid = 5
    harrisim = harris.compute_harris_response(im1, 5)
    filtered_coords1 = harris.get_harris_points(harrisim, wid+1)
    d1 = harris.get_descriptors(im1, filtered_coords1, wid)
    
    harrisim = harris.compute_harris_response(im2, 5)
    filtered_coords2 = harris.get_harris_points(harrisim, wid+1)
    d2 = harris.get_descriptors(im2, filtered_coords2, wid)
    
    print ('starting matching')
    matches = harris.match_twosided(d1, d2)
    
    figure()
    gray() 
    harris.plot_matches(im1, im2, filtered_coords1, filtered_coords2, matches)
    show()
    

    运行结果:
    在这里插入图片描述

    1.6.2 结果分析

    比对分析:
    从匹配的准确率看来,harris算法的结果存在一些不正确的匹配,而sift算法几乎没有匹配错误。显而易见地,sift算法具有较高的准确度及稳健性(对图片亮度不敏感);
    从时间上来说,sift算法的效率远高与harris算法,所以sift算法具有更高的计算效率;
    总的来说,两个算法由于选择特征点的方法不同,而显示出了差异。sift算法综合了许多前人已经整理出的算法的优点,最后才得到了现在的算法(更优)。

    2. 匹配地理标记图像

    图像拍摄于集美大学,其标志性建筑——尚大楼,拍摄了多张位于不同角度及不同光线下的图像,还有另外几张其他校内建筑的图像。共取了19张图像进行匹配地理标记。

    由于这个例子会对匹配后的图像进行连接可视化,所以需要运用pydot工具包来实现在一个图中用边线表示它们之间是相连的。(因为pydot工具包需要跟其他工具包一起安装才能用,所以这里直接放上别人写的安装链接https://blog.csdn.net/wuchangi/article/details/79589542

    下面是实现代码:

    from pylab import *
    from PIL import Image
    from PCV.localdescriptors import sift
    from PCV.tools import imtools
    import pydot
    
    
    images_path = "C:/Users/ace/Pictures/ims/"
    path = "C:/Users/ace/Pictures/ims/"
    
    # list of images-filenames
    imlist = imtools.get_imlist(images_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('connect-images.png')
    

    运行结果:
    在这里插入图片描述
    可以从结果看出,匹配的最终结果并不很好,一张图出现了重复匹配的现象。可能是图像压缩得太小了,失去了图像原本的特征,导致匹配结果出错。

    展开全文
  • SIFT特征匹配算法介绍——寻找图像特征点的原理

    万次阅读 多人点赞 2017-06-26 15:35:15
    关于opencv的SIFT特征匹配算法原理的详细介绍,附有图文解析,希望能帮助到图像处理刚入门的朋友们(*^__^*) 嘻嘻……

     1.图像尺度空间

    在了解图像特征匹配前,需要清楚,两张照片之所以能匹配得上,是因为其特征点的相似度较高。

    而寻找图像特征点,我们要先知道一个概念,就是图像尺度空间”。

    平时生活中,用人眼去看一张照片时,随着观测距离的增加,图像会逐渐变得模糊。那么计算机在“看”一张照片时,会从不同的“尺度”去观测照片,尺度越大,图像越模糊。

    那么这里的尺度”就是二维高斯函数当中的σ值,一张照片与二维高斯函数卷积后得到很多张不同σ值的高斯图像,这就好比你用人眼从不同距离去观测那张照片。所有不同尺度下的图像,构成单个原始图像的尺度空间图像尺度空间表达”就是图像在所有尺度下的描述。

    尺度是自然客观存在的,不是主观创造的。高斯卷积只是表现尺度空间的一种形式。

     

    2.“尺度空间表达”与“金字塔多分辨率表达”

    尺度空间表达——高斯卷积

    高斯核是唯一可以产生多尺度空间的核。在低通滤波中,高斯平滑滤波无论是时域还是频域都十分有效。我们都知道,高斯函数具有五个重要性质:

    (1)二维高斯具有旋转对称性;

    (2)高斯函数是单值函数

    (3)高斯函数的傅立叶变换频谱是单瓣的

    (4)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的;

    (5)二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长

     

        一个图像的尺度空间L(x,y,σ) ,定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ)卷积运算。 

    二维空间高斯函数表达式

         图像的尺度空间就是:二维高斯函数与原始图像卷积运算后的结果,

    尺度空间的表达式:       

     

     

        左图是二维高斯函数在数学坐标系下的图像。

        右图是高斯函数对应的高斯核。

     

        高斯核是圆对称的,在图片像素中展现出来的是一个正方形,其大小由高斯模板确定。卷积的结果使原始像素值有最大的权重,距离中心越远的相邻像素值权重也越小。


    那么,为什么要提到高斯模糊与“尺度空间表达”,它们有什么关系呢?

    “尺度空间表达”指的是不同高斯核所平滑后的图片的不同表达,意思就是:原始照片的分辨率,和经过不同高斯核平滑后的照片的分辨率是一样的。但是,对于计算机来说,不同模糊程度,照片“看”上去的样子就不一样了。高斯核越大,图片“看”上去就越模糊。

     

    那么,图片的模糊与找特征点有关系吗?

    计算机没有主观意识去识别哪里是特征点,它能做的,只是分辨出变化率最快的点。彩色图是三通道的,不好检测突变点。需要将RGB图转换为灰度图,此时灰度图为单通道,灰度值在0~255之间分布。

       无论人眼观测照片的距离有多远,只要能辨认出物体关键的轮廓特征,那就可以大致知道图像所表达的信息。计算机也一样,高斯卷积之后,图像虽然变模糊了。但是整体的像素没有变,依然可以找到灰度值突变的点。

        而这些点,就可以作为候选特征点了,后期再进一步减少点的数量,提高准确率即可。

     

    金字塔多分辨率表达——降采样

    这个比较好理解,若对一张图片进行降采样,其像素点就会减少,图片尺寸也会随之变小。那么给人的感觉就好比一个金字塔。

    所谓图像金字塔化:就是先进行图像平滑,再进行降采样,根据降采样率不同,所得到一系列尺寸逐渐减小的图像。


    两种表达的不同之处在于:

        “尺度空间表达”在所有尺度上具有相同分辨率,而“图像金字塔化”在每层的表达上分辨率都会减少固定比率。

        “图像金字塔化”处理速度快,占用存储空间小,而“尺度空间表达”刚好相反。

     

    3.LOGLaplassian of Gaussian

    前面提出的那种表达,各有各的优势:

    1)“尺度空间表达”在所有尺度上具有相同分辨率,而“图像金字塔化”在每层的表达上分辨率都会减少固定比率。

    2)“图像金字塔化”处理速度快,占用存储空间小,而“尺度空间表达”刚好相反。

    那么将两者融合起来的话,就得到了LOG图像,高斯拉普拉斯变换图像。其步骤是:先将照片降采样,得到了不同分辨率下的图像金字塔。再对每层图像进行高斯卷积。这样一来,原本的图像金字塔每层只有一张图像,而卷积后,每层又增加了多张不同模糊程度下的照片。

     

     

    然而,LOG图像还不是我们想要的,我们做那么多就是为了更好地获取特征点,所以还需要对LOG图像再进一步地优化。所以,DOG图像横空出世!!

     

    4.DOGDifference of Gaussian

    DOG即高斯差分。

    构造高斯差分图像的步骤是:在获得LOG图像后,用其相邻的图像进行相减,得到所有图像重新构造的金字塔就是DOG金字塔。

    (左图是LOG图像,右图是DOG图像)


     

    5.DOG局部极值点

    寻找极值点

    当得到DOG金字塔后,我们接下来要做的是寻找DOG极值点。每个像素点与其周围的像素点比较,当其大于或者小于所有相邻点时,即为极值点。

    比如说,如下图所示,以黄点为检测点,那么其周围的点,除了同层所包围的8个绿点外,还有上一层的9个点与下一层的9个点。


    极值点精确定位

    而我们找的的极值点是在高斯差分之后所确定下来的,那么其是属于离散空间上的点,不一定是真正意义上的极值点。

    我们需用用到一条曲线来进行拟合。


     

    离散转换为连续,我们会想到泰勒展开式:

    则极值点为:   

    去除边缘影响

    到这一步,得到的极值点是比较精确了,但不够准确。有些极值点不是我们想要的,当中就有一大部分是边缘区域产生的极值点。因为物体的边缘轮廓在灰度图中,存在着灰度值的突变,这样的点在计算中就被“误以为”是特征值。

    仔细分析,边缘区域在纵向上灰度值突变很大,但是横向上的变化就很小了。好比你用黑笔在白纸上水平画一条线段。垂直方向看,黑色线与白色区域的突变很大。但是水平方向看时,黑色线上某一点的水平临近点仍然是黑点,突变程度非常小。

        由于这一特殊性质,我们想到了Hessian矩阵,海塞矩阵是用来求曲率的,可以以函数的二阶偏导为元素,构成一个2x2的矩阵H:

        具体可参见Harris角点检测算法。

     

    6.方向赋值

    经过Harris角点检测算法之后,基本上得到了我们想要的精确特征点了。接下来我们就要求它们的方向。

    DOG 金字塔中,有很多层高斯模糊后的图像。在此,我们对其中一张图像的处理进行说明。当我们精确定位关键点后,需要找到该特征点对应的尺度值σ,根据这一尺度值,将对应的高斯图像的关键点进行有限差分,以3×1.5σ为半径的区域内图像梯度的幅角幅值,得到:

    然后利用直方图统计领域内像素对应的梯度和幅值:梯度方向角为横轴刻度,取45度为一个单位,那么横轴就有8个刻度;纵轴是对应梯度的幅值累加值。

    取幅值最高的方向为主方向。有的时候,会出现第二峰值,因为有较多的关键点是多方向的。如果直接把它忽略掉不加以考虑的话,最后对匹配精度的影响还是蛮大的。

    所以,为了匹配的稳定性,我们将超过峰值能量的百分之80的方向,称为辅方向。

     

    7.关键点描述

    确定描述子采样区域

    到了这里,我们就已经得到赋值后的SIFT特征点了,其包含了位置,尺度,方向的信息。

    接下来的要做的是:关键点的描述,即用一组向量将关键点描述出来。

    SIFI 描述子h(x, y,θ)是对特征点附近邻域内高斯图像梯度统计结果的一种表示,它是一个三维的阵列,但通常将它表示成一个矢量。矢量是通过对三维阵列按一定规律进行排列得到的。特征描述子与特征点所在的尺度有关,因此,对梯度的求取应在特征点对应的高斯图像上进行。

     

     

    生成描述子

    为了保证特征矢量具有旋转不变性,需要以特征点为中心,将特征点附近邻域内(mσ(Bp+ 1)√2 x mσ(Bp+ 1)√2)图像梯度的位置和方向旋转一个方向角θ,即将原图像x轴转到与主方向相同的方向。

    旋转公式如下:

     在特征点附近邻域图像梯度的位置和方向旋转后,再以特征点为中心,在旋转后的图像中取一个mσBp x mσBp大小的图像区域。并将它等间隔划分成Bp X Bp个子区域,每个间隔为像元。

     

    到这里,有人会问:旋转过程中,中图和右图为什么每个像素点的方向不一样?其实,你要明确一点,你所选的小区域,是关键点旋转后的小区域,右图的区域跟旋转前的区域不一样了,右图是重新选取得区域,但是区域大小没变。

     

     

    接下来就是生成特征匹配点。

    在每子区域内计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,形成一个种子点。与求特征点主方向时有所不同,此时,每个子区域的梯度方向直方图将0°~360°划分为8个方向范围,每个范围为45°,这样,每个种子点共有8个方向的梯度强度信息。由于存在4X4Bp X Bp)个子区域,所以,共有4X4X8=128个数据,最终形成128维的SIFT特征矢量。同样,对于特征矢量需要进行高斯加权处理,加权采用方差为mσBp/2的标准高斯函数,其中距离为各点相对于特征点的距离。使用高斯权重的是为了防止位置微小的变化给特征向量带来很大的改变,并且给远离特征点的点赋予较小的权重,以防止错误的匹配。

     

     

        在最后,对特征向量进行归一化处理,去除光照变化的影响

     

     

    8.使用特征检测器

    Opencv提供FeatureDetector实现特征点检测。

    最后把所检测到的特征点放置在一个容器中,再进行后续的图像匹配工作。

    至此,SIFT特征匹配算法讲解结束。

    展开全文
  • 针对水下双目图像匹配时不再满足空气中极线约束条件以及尺度不变特征变换(SIFT)特征匹配算法处理水下图像误匹配率较高等问题,提出一种基于曲线约束的水下特征匹配算法。对双目摄像机进行标定获取相关参数,再获取...
  • SIFT特征匹配算法-SIFT.rar SIFT:Scale Invariant Feature Transform SIFT特征匹配算法是目前国内外特征点匹配研究领域的热点与难点,其匹配能力较强,可以处理两幅图像之间发生平移、旋转、仿射变换情况下的...
  • SIFT特征匹配算法介绍

    2019-01-02 22:32:57
    深度学习----SIFT特征(详解) ...   ...SIFT特征匹配算法介绍——寻找图像特征点的原理 https://blog.csdn.net/weixin_38404120/article/details/73740612   SIFT算法详解 https://blog.csdn...

    深度学习----SIFT特征(详解)

    https://blog.csdn.net/Sakura55/article/details/81506151

     

    SIFT特征匹配算法介绍——寻找图像特征点的原理

    https://blog.csdn.net/weixin_38404120/article/details/73740612

     

    SIFT算法详解

    https://blog.csdn.net/zddblog/article/details/7521424

    展开全文
  • sift特征提取与匹配C++代码,1000行完整代码,超详细注释,基本每五行一注释,有少许BUG。 1.提取特征点算法(包括尺度空间的极值探测、关键点的精确定位、确定关键点的主...2.匹配算法 3.运行需要调用openCV3.4.0库。
  • SIFT特征提取+匹配

    2018-10-20 14:31:35
    该程序调用opencv库函数实现的SIFT特征点提取及匹配,其中有两组图片以供测试。程序配置库为opencv2.4.9+vs2013。
  • 基于GPU的SIFT特征匹配算法并行处理研究.pdf
  • 用opencv+VS2012实现的SIFT特征提取与匹配算法,已编译通过,直接打开就能运行
  • 电信设备-融合颜色信息和全局信息的SIFT特征匹配算法.zip
  • SIFT特征匹配算法简介

    千次阅读 2014-06-11 14:22:05
    鉴于自己的毕设是与视频检索有关,而在图像和视频检索领域中,D.Lowe和他的“亲儿子”——SIFT( Scale Invariant Feature Transform )算法是不能错过的经典论题,我在之前闲逛过的一个技术博客站点中找到了介绍这一...
    鉴于自己的毕设是与视频检索有关,而在图像和视频检索领域中,D.Lowe和他的“亲儿子”——SIFT( Scale Invariant Feature Transform )算法是不能错过的经典论题,我在之前闲逛过的一个技术博客站点中找到了介绍这一经典算法基本概念的文章,原文地址:http://www.dakaren.com/index.php/archives/639.htm   
    

    1、SIFT算法基本概念

    Sift是David Lowe于1999年提出的局部特征描述子,可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有良好的不变性和很强的匹配能力。SIFT算法是一种提取局部特征的算法,也是一种模式识别技术,其基本思想是在尺度空间寻找极值点,提取位置,尺度,旋转不变量,它主要包括两个阶段,一个是Sift特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量;第二阶段是Sift特征向量的匹配。Sift及其扩展算法已被证实在同类描述子中具有最强的健壮性,目前是国内外研究的热点。

    2、SIFT算法的主要特点:

    a) SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变 性,对视角变化、仿射变换、噪声也保持一定程度的稳定性,而对物体运动、遮 挡、噪声等因素也保持较好的可匹配性,从而可以实现差异较大的两幅图像之间 特征的匹配。

    b) 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行 快速、准确的匹配,比原有的harris点匹配方式具有更高的匹配准确度。

    c) 多量性,即使少数的几个物体也可以产生大量SIFT特征向量。

    d) 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求。

    e) 可扩展性,可以很方便的与其他形式的特征向量进行联合。

    SIFT算法基于图像特征尺度选择的思想,建立图像的多尺度空间,在不同尺度下检测到同一个特征点,确定特征点位置的同时确定其所在尺度,以达到尺度抗缩放的目的。剔除一些对比度较低的点以及边缘响应点,并提取旋转不变特征描述符以达到抗仿射变换的目的。

    3、SIFT算法步骤:

    1) 构建尺度空间,检测极值点,获得尺度不变性;

    2) 特征点过滤并进行精确定位;

    3) 为每个关键点指定方向参数

    4) 生成关键点的描述子

    5) 当两幅图像的Sift特征向量生成以后,下一步就可以采用关键点特征向 量的欧式距离来作为两幅图像中关键点的相似性判定度量。取一幅图中的某个关键点,通过遍历找到另一幅图中的距离最近的两个关键点。在这两个关键点中,如果次近距离除以最近距离小于某个阙值,则判定为一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。

    4、SIFT算法发展历程:

    Sift算子最早是由David.G.Lowe于1999年提出的,当时主要用于对象识别。2004年David.G.Lowe对该算子做了全面的总结及更深入的发展和完善,正式提出了一种基于尺度空间的、对图像缩放、旋转甚至仿射变换保持不变性的图像局部特征描述算子——Sift( Scale Invariant Feature Transform )算子,即尺度不变特征变换。Rob Hess 基于GSL和Opencv编写了相应的C语言程序,后来Y.Ke将其描述子部分用PCA代替直方图的方式,对其进行改进。在Mikolajczyk对包括Sift算子在内的十种局部描述子所做的不变性对比实验中,Sift及其扩展算法已被证实在同类描述子中具有最强的健壮性。

    主要文献:

    1)David G. Lowe, “Object recognition from local scale-invariant features,” International Conference on Computer Vision, Corfu, Greece  2)David G. Lowe, “Distinctive image features from scale-invariant keypoints,” International Journal of Computer Vision,

    3)Y. Ke and R. Sukthankar. PCA-SIFT: A More Distinctive Representation for Local Image Descriptors.Computer Vision and Pattern Recognition, 2004

    5、关于局部不变特征

    1)局部不变特征的概念

    局部不变特征就是由局部邻域所构成的一个图像模式。局部不变特征可以是点集,也可以是边缘集合,或者一些小的图像块集合,甚至是上述集合的复合体。局部不变特征认为图像中总是存在一些特殊的区域,这些区域中的特征比其它图像区域的特征更加稳定,信息含量更高,能够表征图像的内容。局部不变特征的局部是指特征只是图像的局部区域,不变性是指该特征不会因为图像经历了各种变换而发生变化。

    2)局部不变特征特点

    局部不变特征的种类繁多,适合不同的特征提取场合,各自独立性较强,相互之间可以组合和借鉴。复合类型的局部不变特征可能会增加计算负担,但是能够取得更好的性能。

    3)局部不变特征的应用

    局部不变特征是一种十分有效的工具,大量研究表明它能够适应各种图像处理的应用场合,特别是在模拟人类视觉系统的物体识别领域,拥有强大的应用性。从直观的人类视觉印象来看,人类视觉对物体的描述也是局部化的,基于局部不变特征的图像识别方法十分接近于人类视觉机理,通过局部化的特征组合,形成对目标物体的整体印象,这就为局部不变特征提取方法提供了生物学上的解释,因此局部不变特征也得到了广泛应用。

    4)特征描述符

    特征描述符(Featrue Descriptors)指的是检测图像的局部特征(比如边缘、角点、轮廓等),然后根据匹配目标的需要进行特征的组合、变换,以形成易于匹配、稳定性好的特征向量,从而把图像匹配问题转化为特征的匹配问题,进而将特征的匹配问题转化为特征空间特征向量的聚类问题。

    5)局部不变特征检测与局部不变特征区域的概念

    局部不变特征检测就是从图像中检测出具有某种几何和光学不变性(geometric and photometric invariant)的局部不变特征区域。局部不变特征区域是以特征点(feature point or key point)为中心带有尺度信息的图像局部区域。局部不变特征认为,在大多数的图像中总能找到一些性质特殊的区域,它们可以稳定的提取,并且对各种图像变化具有良好的鲁棒性且包涵更多的图像内容信息。

    6、基于局部不变特征的图像处理理论和技术主要包括四个部分:

    1)图像尺度空间:图像数据包含大量混杂在一起的特征信息,按照局部不变特征的思想,这些特征信息是归属于不同类型不同属性的目标物体,其位置和控制区域各不相同,不同分布和参数的特征相互叠加和组合,这使得特征提取变得困难,所以需将这些特征进行一定的“分离”操作,将各类特征分散到整个图像数据空间中去,图像尺度空间就是为图像的各种不同类特征分离提供的一种数据表示法。

    2)局部不变特征检测:在尺度空间内构造不变特征检测函数,生成对应尺度下的局部不变特征空间,检测其中具有一定特征显著性的局部不变特征区域,并把它作为特征描述的目标区域,确定每个特征的尺度系数,局部不变特征结构的位置和尺度范围。这些局部区域及其包含的信息形成对图像语义结构信息的表示,为进一步的特征描述提供图像内容的结构和范围信息。

    3)局部不变特征描述:局部不变特征检测获得的特征仅仅给出了图像内容的结构信息,局部不变特征区域还需要从图像尺度空间表示的数据形式转化特征描述向量。局部不变特征描述就是用局部不变特征描述符(Local feature descriptor)去描述局部不变特征区域,用尽可能相互独立和完备的特征描述数据来表示复杂组合的目标物体,完整详细地描述图像内容,给出图像的语义信息。

    4)特征匹配和检索:特征提取的最终目的是使用这些特征来进行目标识别和特征的检索,通过对特征描述空间中的特征数据进行分类、匹配和检索,实现各种图像识别应用。由于其良好的鲁棒性和抗干扰性,使的它作为目标识别中机器学习样本描述的首选特征,图像和视频检索方法也大都采用局部不变特征作为学习和检索的依据。

    7、局部不变特征发展方向

    目前,局部不变特征主要分为两个发展方向:

    1) 结构化的局部不变特征提取模型,也就是特征提取模型分为四个较为清晰的处理模块(上文中有提到)。在局部不变特征检测方面,D.Lowe提出基于扩散方程的尺度不变的SIFT特征检测方法,以及由角点检测发展而来的Multi-scale Harris检测,具有仿射不变性的Harris-Laplace/Affine检测等,目前局部不变特征检测方法逐渐向着检测具有多种不变性和抗干扰性强的局部不变特征的方向发展。局部不变特征描述技术更加广泛,其中以SIFT,GLOH,Steerable Filters,Shape Context,Complex Filters等为主要特征描述符。特征检索和匹配模块一般是面向图像模式识别的具体应用场合,如图像检索,机器学习的样本特征集合,目标识别中的样本特征数据库等,同时在视频的检索领域也获得不错的效果。

    2) 模仿人类的视觉系统,通过模仿人类视觉系统的运作原理提出了显著性区域理论。这一理论认为图像中的每个局部区域的重要性和影响范围并非同等重要,即特征不是同等显著的,其主要理论来源是Marr的计算机视觉理论和Treisman的特征整合理论,一般也称为“原子论”。该理论认为视觉的过程开始于对物体的特征性质和简单组成部分的分析,是从局部性

    质到大范围性质,图像中的每个局部不变特征的视觉显著性是不同的,所以在局部不变特征的提取和描述时也遵循与人眼视觉注意选择原理相类似的机制(Visual Selective Attention Mechanism)。

    8、软件:SIFT Keypoint Detector

    该软件是可以在Linux或Windows系统中运行的汇编代码形式的SIFT特征点检测器, 它可以输出特征点和可以匹配到一个简单的ASCII格式文件需要的所有信息。 所提供的MATLAB程序和示例C代码可以读取特征点并根据它们对两幅图片进行匹配。

    9、应用前景

    SIFT算法是模式识别的一种高效手段,凡模式识别的应用方面都可以运用SIFT算法来改进识别速度。

    医学:运动学人体机能研究

    仿生学:人工模拟生物

    人工智能:智能机器人、智能驾驶

    刑侦技术:跟踪

    军事用途:敌友识别(战机、战舰、潜艇、雷达跟踪等等)
    展开全文
  • 一种改进的快速sift特征匹配算法,采用建立DoM的尺度空间
  • matlab实现的SIFT特征提取的全代码,可运行 可测试 很不错的sift原代码
  • opencv实现的SIFT算法源码,包含图像的SIFT特征提取算法,以及图像之间的基于SIFT特征匹配算法
  • 本文针对图像特征匹配算法SIFT算法介绍了其算法原理,并贴出了代码。
  • matlab编制,可以有效实现双目视觉特征匹配,利用Sift算法进行特征匹配
  • sift特征匹配matlab

    2021-04-23 17:55:04
    首先对彩色壁画图像提取 SIFT 特征 点与特征向量,然后对每个特征点提取 HSI 彩色特征,最后按定义的相似性度 量公式计算两个特征点之间的距离,确定二者是否匹配。...通过计算机中 的 Matlab 软件对图片进行处理,包括...
  • 基于SIFT特征描述子的立体匹配算法 文主要贡献为,提出了多颜色空间融合差分、Haar 特征密度分布图以及多特征融合的图像匹配方法。
  • matlab实现sift算法匹配

    2014-04-14 15:36:24
    matlab实现的sift算法,各个步骤的实现很清楚,运行可看效果。
  • 鉴于摄像机采集的图像一般都存在一定程度的旋转和平移,一般的匹配算法都存在较高的误匹配率,引入极线约束,提出一种改进的SIFT特征匹配 算法,并在MATLAB中实现算法,实验结果证明该算法有效
  • Python-opencv3 SIFT算法特征匹配

    万次阅读 多人点赞 2018-04-13 17:51:39
    最近接触一个项目:根据设计师定出的psd格式文件(photoshop),生成不同尺寸的海报。这里面牵扯到了尺度不变而对特征做变换的问题...SIFT(Scale-invariant feature transform),也叫尺度不变特征变换算法,是Davi...
  • 这是SIFT算法,其中核心代码是SIFT特征匹配代码
  • 提出一种改进的SIFT特征匹配算法.以提高图像特征匹配算法效率为目的,研究了SIFT特征点描述子基于欧氏最小距离测度的匹配算法.由于SIFT特征点检测算法检测到的特征点数量较大,且每个特征点描述子都是128维的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,930
精华内容 5,172
关键字:

sift特征匹配算法