BRISK算法学习笔记

一、部分原文解读

1.尺度空间关键点检测

        兴趣点用一个显著性标准在图像和尺度空间进行识别。为了加快计算的效率,关键点可以在金字塔图像的层或者层之间进行检测。每个关键点的位置和尺度通过二次函数拟合的方式在持续的区域获得。

2.关键点描述

         一个由依靠合适的尺度中心圆的点组成的采样方式是应用在每个关键点的邻域上来恢复灰度值:计算局部梯度强度的过程中,特征的方向可以被确定。最终,BRISK的采样方式被用来获取被组合到二值化BRISK描述子的成对亮度比较结果。一旦形成,基于二进制描述子的BRISK关键点可以很快地进行匹配。

       在本文中,我们用了一种新颖的成为“BRISK”的方法用于高质量、快速、描述和匹配。此方法在一个有意义的延展上是旋转和尺度不变性的。对比最先进的技术可以戏剧性的降低运算成本。在描述方法后,我们利用基准数据和用评估方法的标准呈现了实验结果。也就是,我们用SURF和SIFT这个广泛作为图像转换的标准来评估BRISK。重点在于BRISK描述子和其他关键点描述子的结合而且反之亦然。

       考虑到计算的效率,我们的检测方法是被Mair的工作启发的。他们的AGAST是以FAST为基础来扩展的,对于特征获取来说是很有效的一个方法。考虑到尺度不变性是高质量关键点的关键,我们用在图像平面和用FAST分数作为手段的尺度空间来进行深层次的搜寻最大值。虽然对比与另外好的描述子(如:快速Hessian)在大的尺度间隔下会有离散化,BRISK描述子可以在连续的尺度空间评估每个关键点的正确尺度。在BRISK框架,金字塔由n层倍频程和n层内部倍频程组成,典型的,n=4。倍频程是用从原图一半下采样得到的。每个内部倍频程位于倍频程之间。第一内部倍频程是有原图的1.5因子下采样得到的。剩下的内部倍频程是由联系的半采样得到的。对于FAST和AGAST的关键点提供不同选择的掩膜形状都是很重要的。在BRISK,我们几乎用9-16的掩膜,它在16像素的圆里提供了至少9个连续像素,这样在无论是比中心像素更亮或者更暗的情况在FAST的标准下都能成功执行。

        刚开始,FAST 9-16描述子用同样的阈值T在每个倍频程和内部倍频程分别执行来识别潜在的兴趣区域。接下来,这个区域中的点将在尺度空间中进行非极大值抑制:首先,问题中的点需要在同一层中的8邻域内达到最大值的条件。分数s被定义为最大值阈值也成为图像点。第二,在此层上面和下面的分数越低越好。我们选择2内部平等尺寸方形补丁:边长度被选为2个像素。由于邻层用不同的离散化来呈现,一些插值应用在补丁的边缘上。下图中描述了采样和最大搜索。

BRISK算法学习笔记_第1张图片

        关键点是用分析三个相邻层的8邻域的分数来进行判断的。在三个层中,局部最大值进行亚像素优化,之后,1维的抛物线在尺度轴上进行拟合来决定关键点的正确尺度。关键点的位置在最靠近决定尺度的最大值之间进行重新插值。考虑到图像的连续性质量不只要在图像上也要在尺度规模上,我们对每个最大值执行了亚像素和持续化规模的优化。为了限制优化过程的复杂性,我们对每个三层的组合做了一个最小二乘意义上的二次方程拟合,使得在三个亚像素优化到卓越的最大值。为了避免重采样,在每层上考虑用3*3的补丁。然后,这些优化后的分数用来拟合抛物线。在最终的阶段,我们重新插值了在各层之间的图像。对于在两个船序列间的BRISK检测例子在图2中进行展示。

BRISK算法学习笔记_第2张图片

       圆的尺寸决定了检测特征点的尺度,径向决定了它们的方向。为了更清晰,检测阈值设置了一个比经典设置更严格的值,产生了略低的重复性。

3.关键点描述子

       给了一系列关键点,包含亚像素优化图像位置和浮点尺度值,BRISK描述子被一个连接亮度比较测试结果的二值化字符串组成。这个方法很有效,然而这里我们用一种更有效的方法。在BRISK中,我们识别了每个关键点的方向特征用来做方向归一化,强化了实现旋转不变性这个对鲁棒性的关键点。而且,我们仔细的选择了亮度对比。

BRISK算法学习笔记_第3张图片

BRISK采样模式用N=60个点:小蓝色圆贡献了采样位置;大的,红色虚线的圆表示用来平滑的高斯核的值。这个模式显示了尺度为1的情况。

4.采样方式和旋转评估

        BRISK描述子的关键概念使用了采样关键点邻域的模式。这个模式,在下图中描述,定义了N均分在圆上的位置。虽然这个方式类似于DAISY描述子,但是它在BRISK的应用上是完全不同的,因为DAISY是用来做密集匹配的。能够捕获更多的信息,因此对速度和存贮量有要求。为了避免在这种模式下对点进行采样的重叠影响,我们使用了高斯平滑。通过图像中的关键点k定位和尺度化,这种方式考虑到采样点对的N(N-1)/2中的点。在这些点中的平滑值用来估计局部梯度:

BRISK算法学习笔记_第4张图片

阈值的距离设置为最大为9.75t,最小为13.67t。通过迭代,评估整个关键点k是:

长距离对被用来计算,建立在局部梯度而不需要全局梯度。这也可以试验性的用距离阈值的最小值来判断。

5.建立描述子

        对于旋转和尺度归一化描述子,BRISK运用了在关键点k旋转\alpha =arctan2(g_{y},g_{x})的采样方式。向量描述子由所有的短距离强度点对组成,每个位b相关的式子是:

虽然BRIEF描述子也通过亮度比较来组成,BRISK有一些和采样方式的明显缩放和旋转不同。首先,BRISK用一个确定的采样方式使得采样点分布在关键点的给定半径内。因此,定制的高斯滤波在两个模糊的采样点中进行时,比较的亮度不容易变形。BRISK用相当少的采样点减少了查找的强度值。最终,这里的比较被分别限制使得亮度只在局部范围内变化。根据上述的采样方式和距离阈值,我们获得了一个512的字节长度。这个BRIEF64包含512位,也就是描述子对的匹配将会同样快。

6.描述子匹配

        匹配两个BRISK描述子是在BRIEF中用简单的Hamming距离。看两个描述子的数目相同但位不同的异或为1的数。

执行说明:所有的BRISK建立在普通2维特征表面,允许存在的特征的简单的集成和可交换。检测过程用了AGAST实现计算的卓越性。极大值抑制得益于早期终止能力减少了了最小值的计算量。建立图像金字塔使用了一些SSE2和SSSE3的指令。进行了半采样和1.5因子的下采样。为了有效的用采样方式检索灰度值,我们生成了离散旋转和缩放的BRISK方式版本需要40MB的RAM容量,对于低计算的完全够的。我们接下来用一个积分图像和一个简易的高斯核函数,这个高斯函数的核是尺度的计算量不会有很复杂的变化。之后我们用了一个方箱平均滤波器。虽然我们不需要用许多不同核的时间高斯滤波器,但是我们需要用一个任意的参数替换检索单值。我们也使用了改进的SSE汉明距离计算器使得匹配的速度达到6倍。

7.总结

        BRISK,解决了经典的视觉识别、描述和没有场景先验知识和相机姿势的匹配关键点问题。和现有基础算法对比,像SIFT和SURF,比较匹配性能方面,这个算法快很多。BRISK依靠简单的圆形采样方式,它计算亮度对比值形成二进制描述子字节。BRISK的这种独特的方式可以广泛的应用,尤其是对于实时限制和计算能力:BRISK最终提供了在如此时限应用下的高端特征的质量。在之后对BRISK的深度研究,我们旨在探索尺度空间的最大值来达到更高的重复性同时还保持了速度。

 

二、代码

这里用opencv进行编程

在特征库features2d中有现成的BRISK的算子。按BRISK的原理步骤,要先用FAST进行关键点的确定,之后生成描述子,然后再用汉明距离进行相似比较。

1.关键点检测

    Mat c_src1 =imread("F://lena.jpg",1);
    Mat c_src2 = imread("F://lena1.jpg",1);
    Mat src1 = imread("F://lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    Mat src2 = imread("F://lena1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    cv::BRISK detector;
    std::vectorkp1;
    std::vectorkp2;
    detector.detect(src1,kp1);//这里用灰度图进行关键点的检测
    detector.detect(src2,kp2);

2.描述子的形成

    Mat des1,des2;
    int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;
    detector.compute(src1,kp1,des1);//描述子
    detector.compute(src2,kp2,des2);
    Mat res1,res2;
    drawKeypoints(c_src1,kp1,res1,Scalar::all(-1),drawmode);//在内存中画出特征点,以防堆栈异常
    drawKeypoints(c_src2,kp2,res2,Scalar::all(-1),drawmode);

3.匹配

    BFMatcher matcher(NORM_HAMMING);//用汉明距离作为匹配准则
    vector matches;
    matcher.match(des1,des2,matches);
    Mat img_match;
    drawMatches(src1,kp1,src2,kp2,matches,img_match);//生成匹配图像
    imshow("",img_match);
    waitKey();

BRISK算法学习笔记_第5张图片

在BRISK下用lena做匹配的效果图。这两幅图在方向和大小上不太一样,可以看到BRISK的旋转不变性和尺度不变性。

 

未完待续。。。。。。。

 

 

 

 

 

 

你可能感兴趣的:(算子用法,BRISK算法,BRISK代码)