过年期间闲来无事,就想来把这半年学习的一些视觉知识(视觉slam相关)做个梳理,就以这篇图像特征点提取与匹配作为开头吧。
关键点:图像上某些特殊的、具有代表的点(常见表示就是图像上的横纵坐标、主方向、尺度等)。
描述子:用一些数学方法描述关键点(常见表示是n维向量)。
角点原理来源于人对角点的感性判断,即图像在各个方向灰度有明显变化。算法的核心是利用局部窗口在图像上进行移动判断灰度发生较大的变化,所以此窗口用于计算图像的灰度变化为:[-1,0,1;-1,0,1;-1,0,1][-1,-1,-1;0,0,0;1,1,1]。人各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。
harris角点性质:
Harris角点检测算子对亮度和对比度的变化不敏感;
Harris角点检测算子具有旋转不变性;
Harris角点检测算子不具有尺度不变性;
SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。
有4个主要步骤:
Surf(Speeded Up Robust Features)类似于SIFT但改进了特征的提取和描述方式,用一种更为高效的方式完成特征的提取和描述。
(1)在生成尺度空间方面,SIFT算法利用的是差分高斯金字塔与不同层级的空间图像相互卷积生成。SURF算法采用的是不同尺度的box filters与原图像卷积
(2)在特征点检验时,SIFT算子是先对图像进行非极大值抑制,再去除对比度较低的点。然后通过Hessian矩阵去除边缘的点。
而SURF算法是先通过Hessian矩阵来检测候选特征点,然后再对非极大值的点进行抑制
(3)在特征向量的方向确定上,SIFT算法是在正方形区域内统计梯度的幅值的直方图,找到最大梯度幅值所对应的方向。SIFT算子确定的特征点可以有一个或一个以上方向,其中包括一个主方向与多个辅方向。SURF算法则是在圆形邻域内,检测各个扇形范围内水平、垂直方向上的Haar小波响应,找到模值最大的扇形指向,且该算法的方向只有一个。
(4)SIFT算法生成描述子时,是将的采样点划分为
的区域,从而计算每个分区种子点的幅值并确定其方向,共计
维。SURF算法在生成特征描述子时将
的正方形分割成
的小方格,每个子区域25个采样点,计算小波haar响应
,一共
维。
大体思路:若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点。
FAST算法特点:
在速度上要比其他算法速度快很多;
受图像噪声以及设定的阈值影响很大;
不产生多尺度特征而且特征点没有方向信息,这样就会失去旋转不变性;
算法步骤
利用Harris或者FAST等方法检测特征点
确定特征点的邻域窗口Patch,并对该邻域内像素点进行σ=2σ=2、窗口尺寸为9的高斯平滑,以滤除噪声(也可直接对整幅图像做高斯平滑)
在邻域窗口内随机选取n对(n可取128、256等)像素点,并根据灰度值大小编码成二进制串,生成n位(bit)的特征描述子
缺点
1.对噪声敏感(因为二进制编码是通过比较具体像素值来判定的)
2.不具备旋转不变性
3.不具备尺度不变性
ORB特征是将FAST特征点的检测方法与BRIEF特征描述子结合起来,并在它们原来的基础上做了改进与优化。据说,ORB算法的速度是sift的100倍,是surf的10倍。
oFAST特征点:
建立金字塔,来实现特征点的多尺度不变性。设置一个比例因子scaleFactor(opencv默认为1.2)和金字塔的层数nlevels(pencv默认为8)。将原图像按比例因子缩小成nlevels幅图像。缩放后的图像为:I’= I/scaleFactork(k=1,2,…, nlevels)。nlevels幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点。
ORB算法提出使用矩(moment)法来确定FAST特征点的方向。也就是说通过矩来计算特征点以r为半径范围内的质心,特征点坐标到质心形成一个向量作为该特征点的方向。
rBRIEF特征描述:
在使用oFast算法计算出的特征点中包括了特征点的方向角度,在主方向及相应尺度上取点对,计算出二进制描述子。
在我们得到了不同图像上的特征点与描述子后,想要找到匹配点可以用以下方法,当然这些都是最基础的方法,在后续仍需要其他方法增加匹配点与去除误匹配。
1、基于阈值
如何描述子之间的距离小于某个阈值,则认为他们相互匹配,由于大小阈值的的描述子可能有很多个,因此该方
可能会得到多个与之匹配的描述子。
if |Da-Db| else dismatch 2、基于最近邻 如果Db就Da的最近邻,并且 距离小于某个阈值,则认为他们相互匹配。该方法得到唯一的匹配 3、基于距离比率(distance ratio)的最近邻 该方法与最近邻类似,不同的是其对最近邻与次近邻间的distance ratio应用阈值处理 即:if ||Da-Db||/||Da-Dc|| 该方法保证与Da匹配的描述子只有一个,其它的与其相差较大。这在描述子评价中有非常重要的作用,如果 一种描述子能保证上述条件,那么该描述子优于其它描述子。 特征点算法的详细描述可以查看这篇博客:https://blog.csdn.net/gwplovekimi/article/details/80019589