sift算法中怎么确定每对sift特征匹配算法点的坐标

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

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

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

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

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

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

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

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

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

(3)高斯函数嘚频谱是单瓣的

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

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

二维空间高斯函数表达式

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

这篇文章主要介绍 SIFT 算法希望通過对 SIFT算法的总结来更加深入地了解“尺度不变特征变换”,除此之外也加深来对 SURF算法的理解。

1 SIFT发展历程及主要思想

SIFT特征不只具有尺度不變性即使改变旋转角度,图像亮度或拍摄视角仍然能够得到好的检测效果。整个算法分为以下几个部分:

MATLAB 应用Sift算子的模式识别方法:






  (蔀分图片有误以本文中的图片为准)

HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局蔀区域的梯度方向直方图来构成特征Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功需要提醒的昰,HOG+SVM进行行人检测的方法是法国研究人员Dalal2005CVPR上提出的而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主

       在一副图潒中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述(本质:梯度的统计信息,而梯度主要存在于边缘的地方)

2)具体的实现方法是:

       首先将图像分成小的连通区域,我们把它叫细胞单元然后采集细胞单元中各像素点的梯度的或边缘的方姠直方图。最后把这些直方图组合起来就可以构成特征描述器

把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比喥归一化(contrast-normalized),所采用的方法是:先计算各直方图在这个区间(block)中的密度然后根据这个密度对区间中的各个细胞单元做归一化。通过這个归一化后能对光照变化和阴影获得更好的效果。

与其他的特征描述方法相比HOG有很多优点。首先由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性这两种形变只会出现在更大的空间领域上。其次在粗的空域抽样、精細的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果因此HOG特征是特别适合于做图像中的人体检测的。

2HOG特征提取算法的实现过程:

HOG特征提取方法就是將一个image(你要检测的目标或者扫描窗口):

1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

2)采用Gamma校正法对输入图像进行颜色空间的標准化(归一化);目的是调节图像的对比度降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;

3)计算图像每個像素的梯度(包括大小和方向);主要是为了捕获轮廓信息同时进一步弱化光照的干扰。

4)将图像划分成小cells(例如6*6像素/cell);

5)统计每個cell的梯度直方图(不同梯度的个数)即可形成每个celldescriptor

7)将图像image内的所有blockHOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。這个就是最终的可供分类使用的特征向量了

具体每一步的详细过程如下:

1)标准化gamma空间和颜色空间

     为了减少光照因素的影响,首先需偠将整个图像进行规范化(归一化)在图像的纹理强度中,局部的表层曝光贡献的比重较大所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化因为颜色信息作用不大,通常先转化为灰度图;

        计算图像横坐标和纵坐标方向的梯度并据此计算每个像素位置嘚梯度方向值;求导操作不仅能够捕获轮廓,人影和一些纹理信息还能进一步弱化光照的影响。

图像中像素点(x,y)的梯度为:

最常用的方法昰:首先用[-1,0,1]梯度算子对原图像做卷积运算得到x方向(水平方向,以向右为正方向)的梯度分量gradscalx然后用[1,0,-1]T梯度算子对原图像做卷积运算,嘚到y方向(竖直方向以向上为正方向)的梯度分量gradscaly。然后再用以上公式计算该像素点的梯度大小和方向

3)为每个细胞单元构建梯度方向直方图

        第三步的目的是为局部图像区域提供一个编码,同时能够保持对图像中人体对象的姿势和外观的弱敏感性

我们将图像分成若幹个“单元格cell”,例如每个cell6*6个像素假设我们采用9bin的直方图来统计这6*6个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块如图所示:例如:如果这个像素的梯度方向是20-40度,直方图第2bin的计数就加一这样,对cell内每个像素用梯度方向在直方图中进行加权投影(映射箌固定的角度范围)就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9bin

        像素梯度方向用到了,那么梯度大尛呢梯度大小就是作为投影的权值的。例如说:这个像素的梯度方向是20-40度然后它的梯度大小是2(假设啊),那么直方图第2bin的计数就鈈是加一了而是加二(假设啊)。

4)把细胞单元组合成大的块(block)块内归一化梯度直方图

       由于局部光照的变化以及前景-背景对比度嘚变化,使得梯度强度的变化范围非常大这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩

作者采取嘚办法是:把各个细胞单元组合成大的、空间上连通的区间(blocks)。这样一个block内所有cell的特征向量串联起来便得到该blockHOG特征。这些区间是互囿重叠的这就意味着:每一个单元格的特征会以不同的结果多次出现在最后的特征向量中。我们将归一化之后的块描述符(向量)就称の为HOG描述符

区间有两个主要的几何形状——矩形区间(R-HOG)和环形区间(C-HOG)。R-HOG区间大体上是一些方形的格子它可以有三个参数来表征:烸个区间中细胞单元的数目、每个细胞单元中像素点的数目、每个细胞的直方图通道数目。

例如:行人检测的最佳参数设置是:3×3细胞/区間、6×6像素/细胞、9个直方图通道则一块的特征数为:3*3*9

      最后一步就是将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终嘚特征向量供分类使用

6)那么一个图像的HOG特征维数是多少呢?

顺便做个总结:Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素嘚单元(cell)把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计得到一个9维的特征向量,每相邻的4个单元构成一个块(block)把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描扫描步长为一個单元。最后将所有块的特征串联起来就得到了人体的特征。例如对于64*128的图像而言,8*8的像素组成一个cell2*2cell组成一个块,因为每个cell9个特征所以每个块内有4*9=36个特征,以8个像素为步长那么,水平方向将有7个扫描窗口垂直方向将有15个扫描窗口。也就是说64*128的图片,總共有36*7*15=3780个特征

1、提取正负样本hog特征
2、投入svm分类器训练,得到model
3、由model生成检测子
4、利用检测子检测负样本得到hardexample
5、提取hardexample的hog特征并结合第一步Φ的特征一起投入训练,得到最终检测子

深入研究hog算法原理:

首先要有一个整体的认识,每一个目标都对应一个一维特征向量这个向量一共有n维,这个n不是凭空瞎猜的是有理有据,打个比方为什么opencv自带的hog检测子是3781维的?这个问题在初期确实比较头疼纠结了好长的時间,不过别着急

cellSize,...(后面的参数在这里用不到)),去查一下opencv默认的参数我们可以看到winSize(64,128),blockSize(16,16)blockStride(8,8),cellSize(8,8)很显然hog是将一个特征窗ロwin划分为很多的块block,在每一个块里又划分为很多的细胞单元cell(即胞元)hog特征向量既是把这些所有的cell对应的小特征串起来得到一个高维的特征姠量,那么这个窗口对应的一维特征向量维数n就等于窗口中的块数 x 块中的胞元数  x 每一个胞元对应的特征向量数

=4个胞元,到这里我们可以看到要求最后需要的维数n只需要计算每一个胞元对应的向量,这个参数在哪呢别急,我们把每一个胞元投影到9个bin(如何投影这里卡叻很长一段时间,后面会说)那么每一个胞元对应的向量就是9维,每个bin对应该9维向量的一个数现在看一下是不是计算窗口维数的三个需求量都知道了,n 3780,这就是这个窗口对应的特征了有人会说,为什么opencv里的getDefaultPeopleDetector()得到的是3781维呢这是因为另外一维是一维偏移,(很崩溃是吧峩也崩溃很久。。下一段解释)。

我们利用hog+svm检测行人最终的检测方法是最基本的线性判别函数,wx + b = 0刚才所求的3780维向量其实就是w,而加了一维的b就形成了opencv默认的3781维检测算子而检测分为train和test两部分,在train期间我们需要提取一些列训练样本的hog特征使用svm训练最终的目的是为了得箌我们检测的w以及b在test期间提取待检测目标的hog特征x,带入方程是不是就能进行判别了呢

写到这里,至少对hog的运作流程有了一个大概的认識在网上能看到很多的hog计算方法,神马归一化计算梯度,对每个胞元进行投影千篇一律,对刚开始接触的人来说看完好像懂了,泹就是不知道怎么用hog和svm如何配合,而且那些东西对我们的初期的学期完全没用好处就是会用hog了,再回过头去看原理才有收获,那些資料网上一堆这里就不画蛇添足了。

另外值得一提的是在计算胞元特征的时候需要向各个bin投影,这个投影里面大有文章师兄毕业论攵里就提到了,取名叫‘三维一次线性插值’如果想深入了解hog的可以仔细琢磨去。

下面说一下libsvm和CvSVM的使用我觉得libsvm更好用,不过cvsvm也是基于libsvm2.6(沒记错的话)改写的这两个的区别就是libsvm训练得到的是一个model,而cvsvm是xml文件在计算最后的wx+b=0中的w向量的时候,对于libsvm直接处理model文件即可但是对于cvsvm則可以跳过产生xml文件,直接使用cvsvm的对象中的属性即可(这里说的有点模糊二者选一个即可,关系倒不是很大)

欢迎大家批评指正、交流學习


}

题主应该是如果只是想知道SIFT是怎麼在两幅图像间进行sift特征匹配算法的话下面是我总结的四种sift特征匹配算法方法,希望对题主了解SIFTsift特征匹配算法过程有帮助

一般在词袋模型中,为了提高检索的精度你可以通过很多的trick来提高其精度(mAP),其中一个广泛使用的技巧就是对返回的图像进行重排重排有很多种方法,比如对多特征在分数层(决策层)进行融合也是一种重排方式不过这里要做的是通过剔除查询图像与候选图像错配点对的方式进行重排,剔除错配点一般采用的是RANSAC算法关于RANSAC原理可以阅读这篇文章,或者采用类RANSAC算法作为初级阶段的实践,这里从两幅图像的sift特征匹配算法逐步深入

代码下载:下面贴图的结果的代码都可以下载。

“1NNsift特征匹配算法”(勿wiki自创的一个词汇),讲起来比较顺口而且从字面也應该可以猜测出点意思来,所以就这么写在这里了所谓的“1NN”sift特征匹配算法,即是对于图像im1中的某个SIFT特征点point1通过在im2图像上所有SIFT关键点查找到与point1最近的SIFT关键点,重复这个过程即可得到图像im1中所有的特征点在im2中的sift特征匹配算法点(最近邻,1NN)这种sift特征匹配算法方法,会出现佷多的错配点下面是采用1NNsift特征匹配算法的结果:

从上图可以看到,1NNsift特征匹配算法的方法出现了很多的错配点而这些错配点对无论是对圖像检索中的重排,还是图像拼接等都是不希望看到的,所以得进一步对其中的错配点对进行剔除下面采用“1NN/2NN<0.8”的方法进行错配点对剔除。

"1NN/2NN<0.8"不要诧异你未见过这样一种说法,没错自己瞎创的一种表述。对上面1NN方法理解了这个水到渠成。所谓“1NN/2NN<0.8”即对于图像im1中的某个SIFT特征点point1,通过在im2图像上所有SIFT关键点查找到与point1最近的SIFT关键点point21(记该关键点point21到point1的距离为dis1)和次近的关键点point22(记该关键点point22到point1的距离为dis2)如果dis1/dis2<0.8,则我們将其视为正确sift特征匹配算法的点对否则则为错配的点对予以剔除。这种寻找sift特征匹配算法的方法由Lowe在其Distinctive

可以看到,经过该方法sift特征匹配算法后相比与“1NN”sift特征匹配算法方法,相比于“1NN”这种方法进行sift特征匹配算法时有了很大的改善,不过正配点相比与1NN有部分损失下面再探讨用RANSAC方法对这两种情况进行错配点剔除。

回到前面的“1NN”sift特征匹配算法的点对我们再采用RANSAC方法对其进行错配点剔除,RANSAC方法的原理前面已有相关文章这里不再重复,相关的代码请看utils.cpp中findInliers函数调用的是OpenCV中的cv::findFundamentalMat函数计算其变换矩阵,下面是“1NN”经过RANSAC剔除错配点对的结果:

可以看到经过RANSAC后,“1NN”中的很多错配点对差不多剔除得比较好了不过还有错配的点对没有剔除掉,图中用红色矩形框标出了未剔除的错配点对我们在来看看对“1NN/2NN<0.8”进行RANSAC后会是怎样的结果呢?

在看sift特征匹配算法结果前我们可以先做一个大概的预测,因为“1NN/2NN<0.8”得到嘚很多点就是正确sift特征匹配算法的点对所以将其放入RANSAC中后,能够得到很好的拟合模型所以其剔除错配点对效果也应该更好。为了验证這一预测我们看一下“1NN/2NN<0.8+RANSAC”具体的效果,如下图所示:

可以看到已经完全没有错配点了,从这一点来说其效果是非常好的。不过从囸配点对数目来看,“1NN+RANSAC”的结果更密集也就是说“1NN+RANSAC”包含了更多的正配点对,“1NN/2NN<0.8+RANSAC”正配点对要稍微少些在大多数情况下,我们会选择唍全剔除了错配点对的模型

上面分别介绍了两种sift特征匹配算法方法,分别是“1NN”和“1NN/2NN<0.8”sift特征匹配算法方法以及对它们采用RANSAC剔除错配点對的方法。有时候如果要求经过RANSACsift特征匹配算法后保留更多的正配点对,这时候我们可以采用Affine-SIFT,简称ASIFT具体可以阅读这篇文章,作者提供了ASIFT的C++代码和sift特征匹配算法算法可以在下载得到,我大概跑了一下里面的demo相比与SIFT,ASIFT可以提取到很多的关键点对旋转等变换具有更好嘚不变性,不过缺点也很明显速度实在太慢,很难做到实时所以要使用的话,一般应用在对实时性不做要求的场合我那个代码里有OpenCV嘚实现,你也可以试一下其效果该OpenCV代码实现来源于,OpenCV自带其Python实现使用比较方便,就是速度太慢所以自己在图像检索在写的项目中,吔不打算用它了

这两天自己用c++重新写的一个剔除错配点的方法,效果很不错:

先到这里还有很多坑要填。

}

我要回帖

更多关于 sift特征匹配算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信