特征点检测与匹配

参考博客 图像特征匹配方法——SIFT算法原理及实现_Eating Lee的博客-CSDN博客_sift匹配算法

参考博客https://blog.csdn.net/v_JULY_v/article/details/6186942

在图像处理中,有时候并不需要使用目标所有的像素,所以,可以从图像中提取能够表示图像特性或者局部特性的像素,这些像素叫做角点或者特征点。

使用它可以极大地减少数据量,提高计算速度。它的应用也很广泛,比如基于特征点的图像匹配、定位和三维重建。

一、特征点检测

1、角点

角点是图像中某些属性较突出的像素,比如像素值最大或者最小的点、线段的端点、孤立的边缘点等。

1.1 Harris角点检测

它是最经典的角点之一,是从像素值变化的角度对角点进行定义的。局部像素值最大的角点为 Harris角点。

检测:首先以某一个像素为中心构建一个矩形滑动窗口,通过线性叠加窗口覆盖的图像像素值得到滑动窗口内所有像素值的衡量系数。该系数与滑动窗口内的像素值成正比,即当滑动窗口内的像素值整体变大时,该衡量系数也会变大。在图像中,以每一个像素为中心向四面八方移动窗口时,不管滑动窗口往哪个方向移动,衡量系数都缩小时,滑动窗口的中心对应的图像像素即为 Harris角点。

在这里插入图片描述

2、特征点

2.1 概念

特征点与角点在宏观定义上相同,都是能够表现图像中局部特征的像素。

但是也有区别,特征点具有能够唯一描述像素特征的描述子。

通常,特征点是由关键点和描述子组成的。

关键点就是图像中含有“关键信息”的像素。主要包括像素的位置、角度等信息。

描述子:用来唯一描述关键点的一串数字,又称为描述符,与每个人的个人信息相似。

注意:特征点是图像中含有特殊信息的像素,不仅包含像素的位置和角度,还包括描述像素唯一性的描述子。因此,通常认为特征点是关键点和描述子的组合

2.2 SIFT特征点检测

SIFT(尺度不变特征转换, ScaleInvariant Feature Transform) 是一种著名的尺度不变特征检测法。备受欢迎是因为它在光照、噪声、缩放和旋转等干扰下仍然具有良好的稳定性。

为了实现空间尺度不变性,SIFT特征点模仿了实际生活中物体近大远小、近清晰远模糊的特点。

其主要步骤可以分为:

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

1、先介绍一下尺度空间的定义

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

即,原始图像I(x,y)在不同的尺度e下,与高斯滤波器G(x,y,e)进行卷积,得到L(x,y,e),如下:
       

                                         L(x,y,e) = G(x,y,e)*I(x,y)
其中G(x,y,e)是尺度可变高斯函数,
                                G(x,y,e) = [1/2*pi*e2] * exp[ -(x2 + y2)/2e2]
(x,y)是空间坐标, e是尺度坐标。e值越小表示图像被平滑的越少,相应的尺度就越小

2、高斯差分尺度空间(DOG scale-space)

        Gaussian卷积是有尺寸大小的,使用同一尺寸的滤波器对两幅包含有不同尺寸的同一物体的图像求局部最值将有可能出现一方求得最值而另一方却没有的情况,但是显然假如物体的尺寸都一致的话它们的局部最值将会相同。

        SIFT的精妙之处在于采用图像金字塔的方法解决了上面这一个问题。有了图像金字塔就可以对每一层求出局部最值。

        图像金字塔的构建:图像金字塔共N组,每组有S层,下一组的图像由上一组图像降采样得到。原始图像是金字塔的第一层。为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。如图所示,将图像金字塔每层的一张图像使用不同参数做高斯模糊,使得金字塔的每层含有多张高斯模糊图像,将金字塔每层多张图像合称为一组(Octave)。

         高斯金字塔构建好了之后,对同一组内的相邻图片进行相减操作,构建高斯差分金字塔。

特征点检测与匹配_第1张图片
        为了更有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。
利用不同尺度的高斯差分核与原始图像I(x,y) ,卷积生成。

        D(x,y,e) = ((G(x,y,ke) - G(x,y,e)) * I(x,y)
                              = L(x,y,ke) - L(x,y,e)
3、检测极值点

关键点是由高斯差分空间中的局部极值点组成的,其初步探测是通过同一组内各高斯差分空间中相邻两层图像之间的比较完成的。如下所示,中间的检测点和它同尺度的8个相邻点及相邻尺度对应的9*2个点进行比较,即一共是26个点,这么做的目的是确保在尺度空间和二维图像空间上都检测到极值点。

 

(2)特征点过滤并进行精确定位,剔除不稳定的特征点

以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DOG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。

1、关键点的精确定位

利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。

 

(3)在特征点处提取特征描述符,为特征点分配方向值

SIFT特征点的方向需要根据周围像素梯度进行确定。

对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:

 然后对各店梯度幅值进行高斯加权,使特征点附近的梯度幅值具有较大的权重,远离特征点的梯度幅值具有较小的权重,选择加权后幅值最大的方向作为特征点的主方向。

下图是利用直方图统计邻域内像素的梯度和方向,即以直方图中最大值作为该关键点的主方向

 

(4)生成特征描述子,利用特征描述符寻找匹配点;

        对于每一个关键点,拥有三个信息:位置、尺度以及方向。接下来就是为每个关键点建立一个描述符,用一组向量将这个关键点描述出来。

        为了实现旋转不变性,计算描述子时需要将图像坐标轴旋转到与特征点方向一致,如下图

        在旋转后的图像中以特征点为中心取16*16的邻域作为采样窗口,将采样点(即像素)与特征点的相对梯度通过高斯加权后归入包含8个方向的方向直方图中,最后获得4*4*8的128维特征描述子。

 

 

(5)计算变换参数

        当两幅图像的Sift特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。
        取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。在这两个关键点中,如果次近距离除以最近距离小于某个阙值,则判定为一对匹配点。

总结:

特征点检测与匹配_第2张图片

 

2.3.SURF特征点检测

参考博客:https://blog.csdn.net/dcrmg/article/details/52601010

        虽然SIFT特征点检测具有较高的准确性和稳定性,但是计算速度较慢,无法应用在实时系统中,通常用于离线处理图像。所以提出了一种加快SIFT特征点检测的SURF特征点。

Surf改进了特征的提取和描述方式,用一种更为高效的方式完成特征的提取和描述,具体实现流程如下:

1. 构建Hessian(黑塞矩阵),生成所有的兴趣点,用于特征的提取;

        构建Hessian矩阵的目的是为了生成图像稳定的边缘点(突变点),跟Canny、拉普拉斯边缘检测的作用类似(个人立即,欢迎拍砖),为下文的特征提取做好基础。构建Hessian矩阵的过程对应于Sift算法中的高斯卷积过程。

2. 构建尺度空间

        同Sift一样,Surf的尺度空间也是由O组L成组成,不同的是,Sift中下一组图像的尺寸是上一组的一半,同一组间图像尺寸一样,但是所使用的高斯模糊系数逐渐增大;而在Surf中,不同组间图像的尺寸都是一致的,不同的是不同组间使用的盒式滤波器的模板尺寸逐渐增大,同一组间不同层间使用相同尺寸的滤波器,但是滤波器的模糊系数逐渐增大,

3. 特征点定位

4. 特征点主方向分配

5. 生成特征点描述子

6. 特征点匹配
 

2.4.ORB(FAST检测子+brief描述子)特征点检测

(四十二)特征点检测-ORB - 知乎

        即使SURF特征点已经对SIFT进行了改进并提高了计算速度,但是应用在没有GPU的环境中仍然很难保证算法的实时性。

        ORB特征点有FAST角点与BRIEF描述子组成。

        FAST角点:比较某区域中心像素灰度值与周围像素灰度值的关系,如果周围像素灰度值与中心像素灰度值相比存在明显差异,则可以判定其为FAST角点。

        BRIEF描述子:

二、特征点匹配

SLAM入门之视觉里程计(1):特征点的匹配 - Brook_icv - 博客园

        特征点匹配就是在不同的图像中寻找同一个物体的同一个特征。是图像邻域中寻找不同图像间信息关联的重要方法。因为每个特征点都具有唯一标志身份和特点的描述子,所以实际上特征点匹配就是在两幅图像中寻找具有相似描述子的两个特征点。

        总体可以分为两类方法:

        第一类:计算两个描述子之间的欧氏距离。

        第二类:计算两个描述子之间的汉明距离。

(1)暴力匹配

        暴力匹配是计算训练描述子集合中每个描述子与查询描述子之间的距离,之后将所有的距离进行排序,选择距离最小或者满足阈值要求的描述子作为匹配结果。

(2)FLANN匹配

        暴力匹配的原理很简单,但是算法的复杂度高,如果特征点数目较大,会严重影响程序的运行时间,所以OpenCV4提供了快速近似最近邻库(FLANN),来实现特征点的高效匹配。

(3)RANSAC优化特征点匹配

https://blog.csdn.net/robinhjwy/article/details/79174914?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&utm_relevant_index=11icon-default.png?t=M276https://blog.csdn.net/robinhjwy/article/details/79174914?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&utm_relevant_index=11

        为了更好地提高特征点匹配精度,可以采用RANSAC(随机采样一致)算法。

特征匹配要是遇到误匹配时,如何筛选处理?
答案就是用ransac算法进行过滤。

你可能感兴趣的:(算法)