图像处理检测方法 — SIFT和SURF

0、特征与匹配方法总结汇总对比

  参考:http://simtalk.cn/2017/08/18/%E7%89%B9%E5%BE%81%E4%B8%8E%E5%8C%B9%E9%85%8D/#ORB

1、SIFT 
  参考文献:https://blog.csdn.net/chuhang_zhqr/article/details/50890546

  原理:在前面两节我们学习了一些角点检测技术,比如Harris 等。它们具有旋转不变特性,即使图片发生了旋转,我们也能找到同样的角点。很明显即使图像发生旋转之后角点还是角点。那如果我们对图像进行缩放呢?角点可能就不再是角点了。以下图为例,在一副小图中使用一个小的窗口可以检测到一个角点,但是如果图像被放大,再使用同样的窗口就检测不到角点了。所以在2004 年,D.Lowe 提出了一个新的算法:尺度不变特征变换(SIFT),这个算法可以帮助我们提取图像中的关键点并计算它们的描述符。SIFT 算法主要由四步构成。我们来逐步进行学习。

  尺度空间极值检测:从上图我们可以很明显的看出来在不同的尺度空间不能使用相同的窗口检测极值点。对小的角点要用小的窗口,对大的角点只能使用大的窗口。为了达到这个目的我们要使用尺度空间滤波器。(尺度空间滤波器可以使用一些列具有不同方差_ 的高斯卷积核构成)。使用具有不同方差值_ 的高斯拉普拉斯算子(LoG)对图像进行卷积,LoG 由于具有不同的方差值_ 所以可以用来检测不同大小的斑点(当LoG 的方差_ 与斑点直径相等时能够使斑点完全平滑)。简单来说方差_ 就是一个尺度变换因子。例如,上图中使用一个小方差_ 的高斯卷积核是可以很好的检测出小的角点,而使用大方差_ 的高斯卷积核时可以很好的检测除大的角点。所以我们可以在尺度空间和二维平面中检测到局部最大值,如(x,y,), 这表示在 尺度中(x,y)点可能是一个关键点。(高斯方差的大小与窗口的大小存在一个倍数关系:窗口大小等于6 倍方差加1,所以方差的大小也决定了窗口大小)但是这个LoG 的计算量非常大,所以SIFT 算法使用高斯差分算子(DoG)来对LoG 做近似。这里需要再解释一下图像金字塔,我们可以通过减少采样(如只取奇数行或奇数列)来构成一组图像尺寸(1,0.5,0.25 等)不同的金字塔,然后对这一组图像中的每一张图像使用具有不同方差_ 的高斯卷积核构建出具有不同分辨率的图像金字塔(不同的尺度空间)。DoG 就是这组具有不同分辨率的图像金字塔中相邻的两层之间的差值。

  在DoG 搞定之后,就可以在不同的尺度空间和2D 平面中搜索局部最大值了。对于图像中的一个像素点而言,它需要与自己周围的8 邻域,以及尺度空间中上下两层中的相邻的18(2x9)个点相比。如果是局部最大值,它就可能是一个关键点。基本上来说关键点是图像在相应尺度空间中的最好代表。如下图所示:

  该算法的作者在文章中给出了SIFT 参数的经验值:octaves=4(通过降低采样从而减小图像尺寸,构成尺寸减小的图像金字塔(4 层)?),尺度空间为5,也就是每个尺寸使用5 个不同方差的高斯核进行卷积,初始方差是1.6,k 等于p2 等。

  关键点(极值点)定位:一旦找到关键点,我们就要对它们进行修正从而得到更准确的结果。作者使用尺度空间的泰勒级数展开来获得极值的准确位置,如果极值点的灰度值小于阈值(0.03)就会被忽略掉。在OpenCV 中这种阈值被称为contrastThreshold。DoG 算法对边界非常敏感,所以我们必须要把边界去除。前面我们讲的Harris 算法除了可以用于角点检测之外还可以用于检测边界。作者就是使用了同样的思路。作者使用2x2 的Hessian 矩阵计算主曲率。从Harris 角点检测的算法中,我们知道当一个特征值远远大于另外一个特征值时检测到的是边界。所以他们使用了一个简单的函数,如果比例高于阈值(OpenCV 中称为边界阈值),这个关键点就会被忽略。文章中给出的边界阈值为10。所以低对比度的关键点和边界关键点都会被去除掉,剩下的就是我们感兴趣的关键点了。

  为关键点(极值点)指定方向参数:现在我们要为每一个关键点赋予一个反向参数,这样它才会具有旋转不变性。获取关键点(所在尺度空间)的邻域,然后计算这个区域的梯度级和方向。根据计算得到的结果创建一个含有36 个bins(每10 度一个bin)的方向直方图。(使用当前尺度空间_ 值的1.5 倍为方差的圆形高斯窗口和梯度级做权重)。直方图中的峰值为主方向参数,如果其他的任何柱子的高度高于峰值的80% 被认为是辅方向。这就会在相同的尺度空间相同的位置构建除具有不同方向的关键点。这对于匹配的稳定性会有所帮助。

  关键点描述符:新的关键点描述符被创建了。选取与关键点周围一个16x16 的邻域,把它分成16 个4x4 的小方块,为每个小方块创建一个具有8 个bin 的方向直方图。总共加起来有128 个bin。由此组成长为128 的向量就构成了关键点描述符。除此之外还要进行几个测量以达到对光照变化,旋转等的稳定性。

  关键点匹配:下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取第一个图的某个关键点,通过遍历找到第二幅图像中的距离最近的那个关键点。但有些情况下,第二个距离最近的关键点与第一个距离最近的关键点靠的太近。这可能是由于噪声等引起的。此时要计算最近距离与第二近距离的比值。如果比值大于0.8,就忽略掉。这会去除90% 的错误匹配,同时只去除5% 的正确匹配。如文章所说。这就是SIFT 算法的摘要。非常推荐你阅读原始文献,这会加深你对算法的理解。请记住这个算法是受专利保护的。所以这个算法包含在OpenCV 中的收费模块中。

2、SURF 

  在 上 一 节 中 我 们 学 习 了 使 用 SIFT 算 法 进 行 关 键 点 检 测 和 描 述。 但是 这 种 算 法 的 执 行 速 度 比 较 慢, 人 们 需 要 速 度 更 快 的 算 法。 在 2006 年Bay,H.,Tuytelaars,T. 和 Van Gool,L 共同提出了 SURF(加速稳健特征)算法。跟它的名字一样,这是个算法是加速版的 SIFT。在 SIFT 中, Lowe 在构建尺度空间时使用 DoG 对 LoG 进行近似。 SURF使用盒子滤波器(box_filter)对 LoG 进行近似。下图显示了这种近似。在进行卷积计算时可以利用积分图像(积分图像的一大特点是:计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关),是盒子滤波器的一大优点。而且这种计算可以在不同尺度空间同时进行。同样 SURF 算法计算关键点的尺度和位置是也是依赖与 Hessian 矩阵行列式的。

  为了保证特征矢量具有选装不变形,需要对于每一个特征点分配一个主要方向。需要以特征点为中心,以 6s(s 为特征点的尺度)为半径的圆形区域内,对图像进行 Harr 小波相应运算。这样做实际就是对图像进行梯度运算,但是利用积分图像,可以提高计算图像梯度的效率,为了求取主方向值,需哟啊设计一个以方向为中心,张角为 60 度的扇形滑动窗口,以步长为 0.2 弧度左右旋转这个滑动窗口,并对窗口内的图像 Haar 小波的响应值进行累加。主方向为最大的 Haar 响应累加值对应的方向。在很多应用中根本就不需要旋转不变性,所以没有必要确定它们的方向,如果不计算方向的话,又可以使算法提速。SURF 提供了成为 U-SURF 的功能,它具有更快的速度,同时保持了对 +/-15 度旋转的稳定性。OpenCV 对这两种模式同样支持,只需要对参数upright 进行设置,当 upright 为 0 时计算方向,为 1 时不计算方向,同时速度更快。

  生成特征点的特征矢量需要计算图像的 Haar 小波响应。在一个矩形的区域内,以特征点为中心,沿主方向将 20s*20s 的图像划分成 4*4 个子块,每个子块利用尺寸 2s 的 Haar 小波模版进行响应计算,然后对响应值进行统计,组成向量 v = ( d x , d y , |d x |, |d y |)。这样每个子区域携带4个信息,共有16个子区域,共64维。最后为了防止光照与对比度的影响,对特征矢量归一化处理。这个描述符的长度为 64。降低的维度可以加速计算和匹配,但又能提供更容易区分的特征。为了增加特征点的独特性,SURF 还提供了一个加强版 128 维的特征描述符。当 d y 大于 0 和小于 0 时分别对 d x 和 |d x | 的和进行计算,计算 d y和 |d y | 时也进行区分,这样获得特征就会加倍,但又不会增加计算的复杂度。

  OpenCV 同样提供了这种功能,当参数 extended 设置为 1 时为 128 维,当参数为 0 时为 64 维,默认情况为 128 维。

  在检测特征点的过程中计算了 Hessian 矩阵的行列式,与此同时,计算得到了 Hessian 矩阵的迹,矩阵的迹为对角元素之和。按照亮度的不同,可以将特征点分为两种,第一种为特征点迹其周围小邻域的亮度比背景区域要亮,Hessian 矩阵的迹为正;另外一种为特征点迹其周围小邻域的亮度比背景区域要暗,Hessian 矩阵为负值。根据这个特性,首先对两个特征点的 Hessian 的迹进行比较。如果同号,说明两个特征点具有相同的对比度;如果异号的话,说明两个特征点的对比度不同,放弃特征点之间的后续的相似性度量。对于两个特征点描述子的相似性度量,我们采用欧式距离进行计算。简单来说 SURF 算法采用了很多方法来对每一步进行优化从而提高速度。分析显示在结果效果相当的情况下 SURF 的速度是 SIFT 的 3 倍。SURF 善于处理具有模糊和旋转的图像,但是不善于处理视角变化和关照变化。

3、区别 

  高斯金字塔是对原图像的尺寸是在不断变化的,高斯模板尺寸不变。每一层的建立必须等到上一层构造完毕后才能进行处理,依赖性很强,这样造成速度上很慢。SURF构建尺度金字塔的方法采用原图像大小不变,变化的是模板大小,即采用变化的模板盒子尺寸对原图像进行滤波,构造出尺度空间。同时,SURF可以采用并行运算,对金字塔中的每层图像同时进行处理。通过逐渐增大的盒子尺寸滤波模板与积分图像卷积产生的Hessian矩阵行列式的响应图像,构造出金字塔。

原文地址:https://www.cnblogs.com/eilearn/p/9403871.html

时间: 2024-08-26 08:48:54

图像处理检测方法 — SIFT和SURF的相关文章

图像处理检测方法 — ORB(Oriented FAST and Rotated BRIEF)

1.FAST  FAST算子的基本原理是:若某像素点与其周围领域内足够多的连续的像素点存在某一属性差异,并且该差异大于指定阈值,则可以断定该像素点与其邻域像素有可被识别的不同之处,可以作为一个特征点(角点):对于灰度图像,FAST算子考察的属性是像素与其邻域的灰度差异. 这个检查过程可以用下图更清楚的描述:对于图像上所有像素点,考察其7*7邻域内以该点为圆心,半径是3的圆周上的共计16个像素点和中心点的差异.如果有连续的12(或9)个像素点与中心点的灰度差的绝对值大于或低于某一给定阈值,则该点被

OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配

在前面的文章<OpenCV中feature2D学习--FAST特征点检测>中讲了利用FAST算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测,并结合SIFT/SURF/BRIEF算子进行特征点提取和匹配. I.结合SIFT算子进行特征点提取和匹配 由于数据类型的不同,SIFT和SURF算子只能采用FlannBasedMatcher或者BruteForceMatcher来进行匹配(参考OpenCV中feature2D学习--BFMatcher和FlannBasedMatcher).

角点检测方法

看了将近十来天的OPENCV了,无论是从官方文档,还是learning opencv,还是看各论坛,心里总有种感觉是:无法把自己看的知识联系在一起,感觉都是各有特色功能的函数,可是这些各有特色功能的函数怎么组合在一起,实现什么样的功能就不得而知了. 下面从角点的角度来讲讲吧  --(要说的是有些并非是本人所写,觉得别人有的地方写的经典就复制下来了) 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点: 我们到底要角点干什么?????????????? 下面我来回

sift、surf、orb 特征提取及最优特征点匹配

目录 sift sift特征简介 sift特征提取步骤 surf surf特征简介 surf特征提取步骤 orb orb特征简介 orb特征提取算法 代码实现 特征提取 特征匹配 附录 sift sift特征简介 SIFT(Scale-Invariant Feature Transform)特征,即尺度不变特征变换,是一种计算机视觉的特征提取算法,用来侦测与描述图像中的局部性特征. 实质上,它是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向.SIFT所查找到的关键点是一些十分突出.

OpenCV2.4.9新版本使用问题---sift,surf无法使用

1.sift.surf部分算法无法使用 sift,surf等算法在OpenCV2.4.6中不是免费的,放在nonfree里面了,解决问题的方法是添加#include"opencv2/nonfree/features2d.hpp"头文件,并在附加依赖项中添加相应的动态库 2.编译链接错误 无法解析的外部符号"public:__thiscall cv::SURF::SURF(void)" ([email protected]@@[email protected]),该符

图像处理数学方法

图像处理数学方法 在图像处理的发展过程中,数学始终起着举足轻重的作用,并渗透在图像处理的所有分支之中. 到上世纪六七十年代为止,以Fourier分析为代表的线性处理方法占据了几乎整 个数字图像处理领域.在此期间,借助于随机过程理论,人们建立了图像模型通过概率论以及在此基础上建立的信息论建立了图像编码的框架:线性滤波(维纳滤 波.卡尔曼滤波)方法为低层图像处理提供了有力的理论支持:而FFT则被广泛使用在图像处理的几乎所有分支中.这些数学工具极大地促进了图像处理的发展和 应用. 自上世纪八十年代开始

CVPR2019目标检测方法进展综述

CVPR2019目标检测方法进展综述 置顶 2019年03月20日 14:14:04 SIGAI_csdn 阅读数 5869更多 分类专栏: 机器学习 人工智能 AI SIGAI 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/SIGAI_CSDN/article/details/88687747 SIGAI特约作者 陈泰红研究方向:机器学习.图像处理 目标检测是很多计算机视觉应用的基础,

GDI 泄漏检测方法

方法一 1.打开电脑的[任务管理器],选择[进程]页,点击菜单项的[查看]项,选择[选择列]: 2.勾选[GDI对象(J)]即可. 3.此时,用户就可以在进程中看到每个进程对应的GDI对象,每个进程的GDI对象(网页浏览器除外,每打开一个网页GDI对象都会增加)基本上是一定的,如果不断上涨,则说明程序存在GDI泄漏问题. 方法二 使用检测工具GDIndicator,支持win7+xp 1.启动待检测的程序和GDIndicator,启动顺序没有要求,之后F5刷新,就能看到系统中所有进程,和使用的资

通讯链路的检测方法

问题背景: TCP不能及时通知连接中断,如果使用keep-live机制默认时间是2小时11分钟15秒没有通讯才会发送探测消息,如依靠TCP超时机制可能要等待9分钟才能检测出网络中断,因此必须用户自己检测连接是否正常. 连接中断可能的原因: 1)一方主机崩溃 发不出FIN,对等方依靠重发检测链路中断,如果崩溃方在对等方准备撤销连接之前又重新启动了,若此时收到了消息则会回复RST消息给对等方,这将导致对等方撤销连接,对等方会收到ECONNECREST错误,或者下一次读导致SIGPIPE信号或EPIP