OpenCV第十三讲:SURF特征点的检测与匹配详解
作者:互联网
Dog算子,SIFT特征点, Fast角点 ,ORB特征点 有时间慢慢再来解析
1. SURF的优势
-
SURF主要有以下几点优势
-
SURF是尺度不变特征变换算法(SIFT)的
加速版
,一般来说它比SIFT要快好几倍,且在多幅图像下具有更好的稳定性; -
SURF采用了harr特征+积分图像的概念,大大加快了程序的运行时间。
-
SURF可以应用于计算机视觉的物体识别以及3D重构
-
2.SURF算法原理
1. 构建Hessian矩阵, 构造高斯金字塔尺度空间
SURF构造的金字塔图像与SIFT有很大不同,是造成SURF快很多的原因之一。
Sift采用的是Dog算子, 而surf采用的是Hessian矩阵行列式近似值图像, Hessian矩阵是Surf算法的核心。
但由于特征点需要具备尺度无关性,所以在在计算Hessian矩阵之前,需要对其进行高斯滤波。
-
首先判断该点是否为极值点,才可以决定是否选择其为特征点
判别式的就是Hessian矩阵的行列式, 缩写为det(H), 判别式的值就是H矩阵的的特征值,然后根据判别式的值从而可以判定该点是是不是极值点。
海森矩阵(Hessian): 是一个自变量为向量的二阶偏导数组成的方块矩阵,如下:
它的判别式为:
在SURF算法中,为了计算Hessian矩阵,我们选用二阶标准高斯函数作为滤波器, 通过特定核间的卷积计算二阶偏导数,从而可以得到H矩阵:
而L(x,t)=G(t)⋅I(x,t), G(t)=∂x2∂2g(t).
为应用方便, 有人(Herbert Bay)提出了用近似值线线代替L(x,t), 为了平衡误差引入权值,权值随着尺度变换, 则H矩阵的判别式可表示为:
det(H)=DxxDyy−(0.9Dxy)2
-
SURF相比对SIFT加速的两个地方
- 积分图**(提高计算效率)**:就是当前的每个像素的灰度都是它与坐标原点(0,0)形成的对角线的矩形内的所有像素的灰度值之和。所以我们在计算某个矩阵框内的像素灰度值之和时,就可以很快得出结果。
- 图像金字塔:sift的图像金字塔是逐渐降采样得到的(图像像素降低);而Surf中,图像大小始终保持不变,改变的是滤波器的大小(就是核的尺寸), 这样节省了降采样过程,所以速度提升了。
2. 利用非极大值抑制初步确定特征点
初步特征点的确定: 将经过hessian矩阵处理过的每个像素点与其3维领域的26个点进行大小比较,如果它是这26个点中的最大值或者最小值,则保留下来,当做初步特征点。
3. 精确定位极值点
和sift算法类似,采用三维线性插值法得到亚像素级的特征点,同时也去掉那些值小于一定阈值的点,增加极值使检测到的特征点数量减少,最终只有几个特征最强点会被检测出来。
4. 选取特征点的主方向
-
sift选取特征点主方向
采用在特征点领域内统计其梯度直方图, 取直方图bin值最大的以及超过最大bin值80%的那些方向作为其特征点的主方向。
梯度直方图不熟,记个标签,后面专门补上。
-
SURF选取特征点主方向
不统计起梯度直方图, 而是统计特征点领域内的harr小波特征。即以特征点为中心,统计在一定半径范围内,以60°的扇形区域内x-y方向上的Haar小波响应总和,并给这些响应值按照离特征点的远近赋予不同程度的权重, 最后将最大值那个扇形的作为该特征点的主方向。该过程的示意图如下:
haar小波特征不熟,记个标签2,后面补上更新
5. 构造SURF特征点描述算子
-
sift描述子的选取方式
在sift中,是在特征点周围取16x16的邻域, 并把该领域化为4x4个的小区域,每个小区域统计8个方向梯度,最后得到448 = 128维的向量, 将该向量作为该点的描述子
-
SURF描述子的选取方式
在surf中,是在特征点周围去一个正方形框,该框是有方向的,与上的一步的主方向统一。 然后将该框分为44个小区域,对每个小区域统计25个像素的水平方向和垂直方向的haar小波特征,这里的水平和垂直方向是相对主方向而言的。就可以得到4个值:该haar小波特征的水平方向值之和,水平方向绝对值之和,垂直方向之和,垂直方向绝对值之和。所以从以上可以看出,最后得到44*4=64维的向量, 该向量与sift的向量相比少了一半。
3. SURF缺点
在上面讲述SURF的原理过程中,都与sift特征进行了对比, 突出了surf特征的优势所在,那么现在分析一下surf有那些缺点:
-
求主方向阶段太过于依赖局部区域像素的梯度方向
这有可能使得找到的主方向不准确,而后面的特征向量提取以及匹配都严重依赖于主方向,即便不大偏差角度也可以造成后面特征匹配的误差放大,从而使匹配不成功。
-
图像金字塔的层取得不够紧密
这会使得尺度有误差, 后面的特征向量提取同样依赖相应的尺度,研究者们在这个问题上的解决方法是取适量的层然后进行插值
4.SURF特征的提取和匹配–OpenCV函数
- OpenCV3总SURF/SIFT特征点的检测
int minHessian = 400; ## 检测关键点的数量
cv::Ptr<xfeatures2d::SURF> detector = xfeatures2d::SURF::create( minHessian );
cv::Ptr<xfeatures2d::SIFT> detectorSift = xfeatures2d::SIFT::create(minHessian);
## 画出关键点位置
drawKeypoints(image1, kyPoints1, img_kyPoints1, cv::Scalar::all(-1), DrawMatchesFlags::DEFAULT);
- OpenCVC3中特征点的匹配方式
vector<DMatch> matches;
FlannBasedMatcher matcher;
matcher.match(descrip1, descrip2, matches);
# 画出匹配的关键点
drawMatches ( image1, kyPoints1, image2, kyPoints2, matches, img_matches );
- 测试结果简单展示
4. SURF特征与SIFT特征各项指标对比
且理论上, SURF比SIFT快3倍。
标签:SURF,第十三,特征,矩阵,OpenCV,SIFT,方向,Hessian 来源: https://blog.csdn.net/qq_29797957/article/details/100156303