常见的特征点算法(检测+描述子)

HOG(描述子)

参考博客
HOG+SVM在行人检测中获得巨大成功
HOG的主要思想是图片的局部特征可以被梯度边缘的方向密度分布很好地表达。
方向梯度直方图提取流程:
0、预处理:灰度化(将图像看做一个x,y,z(灰度)的三维图像),采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
1、把窗口划分成若干个块(blocks)
2、将每个块划分为若干个元胞(cells)
3、统计每个元胞内部的梯度方向直方图,并以此为该元胞的特征向量
4、把每个元胞的特征向量相连作为一个块的特征向量
5、将每个块的特征向量相连最为该窗口的特征向量

注:以上步骤1、2为粗的空域抽样,步骤4、5为精细的方向抽样。4、5步骤特征向量的组合并不是简单的相连,为了提高性能采用较强的局部光学归一化,具体方法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。

gamma校正的原因:在图像的纹理强度中局部的表层曝光贡献的比重较大,所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化。因为颜色信息作用不大,通常先转化为灰度图;

优点
由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。
下面是HOG结合svm做行人检测的流程图:
1、输入图片
2、进行归一化和Gamma校正
3、计算图像的梯度图
4、统计每个cell内部的梯度直方图
5、组合每个block内的所有cell的特征描述子
6、连接所有block的特征描述子,组成当前检测窗口的特征描述子
7、收集所有检测窗口的特征描述子
8、利用线性SVM进行分类
9、输出有人/无人
blocks有两个主要的几何形状——矩形区间(R-HOG)和环形区间(C-HOG)。R-HOG区间大体上是一些方形的格子,它可以有三个参数来表征:每个区间中细胞单元的数目、每个细胞单元中像素点的数目、每个细胞的直方图通道数目
例如:行人检测的最佳参数设置是:3×3细胞/区间、6×6像素/细胞、9个直方图通道。则一块的特征数为:339;

总结一个图像的HOG特征维度:
Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元。最后将所有块的特征串联起来,就得到了人体的特征。例如,对于64*128的图像而言,每16*16的像素组成一个cell,每2*2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64*128的图片,总共有36*7*15=3780个特征。

DPM(描述子)

参考博客
DPM对HOG做了改进,具体如下:
1、DPM改进后的HOG特征取消了原HOG中的块(Block),只保留了单元(Cell)
2、归一化时,是直接将当前单元与其周围的4个单元(Cell)所组成的一个区域归一化,所以效果和原HOG特征非常类似。
3、计算梯度方向时可以计算有符号(0-360°)或无符号(0-180°)的梯度方向,有些目标适合使用有符号的梯度方向,而有些目标适合使用无符号的梯度,作为一种通用的目标检测方法,DPM与原HOG不同,采用了有符号梯度和无符号梯度相结合的策略。
4、对于无符号梯度:为了降低特征向量的维度,Felzenszwalb采用了一种近似的PCA降维效果。具体来说,将36维向量看成6*6的矩阵,对每一行,每一列求和得到13维特征,基本上能达到HOG特征36维的检测效果。
5、对于有符号梯度:对18个有符号梯度方向求和得到18维向量
6、综上所述,DPM特征为31维的特征向量(13维+8维)

LBP(Local Binary Pattern)(描述子)

参考博客
LBP是一个用来描述图像矩纹理特征的特征描述子,它最明显的有点就是具有旋转不变性灰度不变性
原始局部二值模式特征:最原始的LBP是定义在一个3*3的窗口内的,其生成过程为:以9个像素中的中心像素为阈值,其周围的8个像素中比它大的设置为1,比它小的设置为0,并以此8位二进制数表示LBP特征,LBP特征的最终表示要转化为10进制数。
改进后的LBP

  • 1、圆形LBP:为了改进原始LBP的主要缺陷——窗口大小不能随这不同尺寸和频率的纹理特征动态变化,Ojala等人将3*3的邻域扩展到半径为R的任意领域,从而产生半径为R的圆形领域内基于P个采样点的LBP算子。
  • 2、LBP旋转不变模式:原始的LBP定义保证了LBP算子的灰度不变性但并不能保证其旋转不变性,为克服此缺陷,Maenpaa等人通过不断旋转圆形邻域并在不同方向的领域计算原始LBP,取所有LBP的最小值来实现LBP算子的旋转不变性
  • 3、LBP的等价模式:如果用原始LBP的定义,那么在p个采样点的LBP算子中,产生的LBP将有种,这不仅仅会降低纹理识别、分类的效果(可能是由于对高频噪声过拟合造成的),而且对信息存取也是不利的,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。
    为了解决以上问题,Ojala提出了一种等价模式(Uniform Pattern)来对LBP算子进行降维,他们认为,绝大多数LBP最多只包含两次0 1或1 0跳变,他们把这些多数模式称为等价模式:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。不是等价模式的其他模式称为混合模式
    通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数,这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。

LBP用于图像处理的原理分析
LBP特征提取完毕后会每个像素点都会得到了个LBP编码,即一幅图片的原始LBP特征图谱依然是一幅图片,如果直接用其判断两幅图的相似程度的话,可能会因为图像位置没有对准而造成去真错误,所以LBP的应用中,如:纹理分类,人脸分析等,一般都采用LBP特征图谱的统计直方图作为特征向量进行分类。
具体的讲,研究发现可以将一幅图片分为若干的blocks,然后在一个block内统计LBP特征,形成该block的LBP直方图作为该block的特征向量,整个图片用来分类的特征向量就是这些blocks特征向量归一化后连接的结果。之后利用相似性度量算法即可判断两幅图片的相似性。

下面的这个步骤不一定是对的

  • 首先将检测窗口划分为16×16的小区域(cell);
  • 对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
  • 然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理。
  • 最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;
  • 然后便可利用SVM或者其他机器学习算法进行分类了。

Haar-like特征(描述子)

参考博客
Haar-like最早由Papageorgiou等人用于人脸识别,Viola和Jones在此基础上使用了3种类别共四种形式的特征,如下图所示:

常见的特征点算法(检测+描述子)_第1张图片

上图中共有(A,C)、B、D三种特征,即水平、垂直、对角三种特征,所以haar-like特征描述子也就只能描述水平、垂直、对角这三种方向的边缘或线段,三种特征模板的特征值计算如下:

  • A:sum(白) - sum(黑)
  • C:sum(白) - 2 * sum(黑)
  • A:sum(白) - sum(黑)
  • A:sum(白) - sum(黑)

Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。
以上提到的特征模板成为特征原型,特征原型经过在图像上平移、伸缩得到的特征成为矩形特征,其值为特征值,矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数,因此随着这三个自变量的变化会产生非常多的矩形特征(数万、数十万),所以这里就会有如下两个问题:

  • 矩形特征的计算问题(可以通过积分图来解决)
  • 分类时有效特征的选择问题(可以通过AdaBoost分类器实现)

积分图的计算
采用动态规划算法计算积分图
积分图能够在多种尺度下,使用相同的时间(常数时间)来计算不同的特征,因此大大提高了检测速度。
Harr-like矩形特征扩展
Lienhart R.等对Haar-like矩形特征库进行了扩展,加入了角的矩形特征,扩展后的特征大致有4种类型:边缘特征、线特征环、中心环绕特征和对角线特征,如下如所示:

常见的特征点算法(检测+描述子)_第2张图片

SIFT(Scale-invariant feature transform)——特征点检测+描述子

参考博客
SIFT即尺度不变特征转换,它是一种捕获影像局部特征的算法,这些特征往往是影像空间尺度的某极值点,SIFT提取器位置尺度旋转不变量,常见的特征如:角点、边缘点、暗区的亮点、亮区的暗点等,这些特征的稳定性非常好,对于光线、噪声、些微视角改变的容忍度相当高,在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。
SIFT的应用范围包括:物体辨识机器人地图感知与导航影像缝合3D模型建立手势辨识影像追踪动作比对
SIFT算法流程图

常见的特征点算法(检测+描述子)_第3张图片

  • 图解1:图像金字塔

  • 图解2:图像卷积

  • 图解3:空间极值点(关键点)的检测
    1、极值点的初步检测是在高斯差分(DOG)金字塔中进行的,具体来说,就是待检测点要域高斯差分金字塔中每组图像的图像域尺度域中的所有相邻像素进行比较,如下图所示:

    常见的特征点算法(检测+描述子)_第4张图片

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

    • 关键点精确定位
      离散空间的极值点并不是真正的极值点,下图显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值

      常见的特征点算法(检测+描述子)_第5张图片

      子像素插值的原理:利用DoG函数在尺度空间的的Taylor展开式——插值函数进行插值,1)求高斯差分尺度空间中任意离散极值点处的泰勒展开式,并舍弃二阶以后的所有项,2)求该泰勒展开式的极值点(),表示相对插值中心的偏移量,当它的任一维度(x, y, σ)大于0.5,则可以认为插值的中心已经偏移到了临近点上,此时应该改变当前极值点的位置,并在新的位置反复插值直到收敛。同时,在此过程中获取特征点的精确位置(原位置加上拟合的偏移量)以及尺度(σ)。

      迭代过程中也有可能超出所设定的迭代次数或者超出图像边界的范围,此时这样的点应该删除,在Lowe中进行了5次迭代。另外,过小的点易受噪声的干扰而变得不稳定,所以将 小于某个经验值(Lowe论文中使用0.03,Rob Hess等人实现时使用0.04/S)的极值点删除。

    • 消除边缘响应
      一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。DOG算子会产生较强的边缘响应,需要剔除不稳定的边缘响应点。获取特征点处的Hessian矩阵,主曲率通过一个2x2 的Hessian矩阵H求出(D的主曲率和H的特征值成正比):

      假设H的特征值为α和β(α、β代表x和y方向的梯度)且α>β。令α=rβ则有:


      其中Tr(H)求取H的对角元素和;Det(H)为求H的行列式值。

      则公式(r+1)^2/r的值在两个特征值相等时最小,随着两个特征值差别的增大而增大。值越大,说明两个特征值的比值越大,即在某一个方向的梯度值越大,而在另一个方向的梯度值越小,而边缘恰恰就是这种情况。所以为了剔除边缘响应点,需要让该比值小于一定的阈值,因此,为了检测主曲率是否在某域值r下,只需检测:

      OpenCV建议r = 10

    3、关键点方向匹配
    为了使描述符具有旋转不变性,需要利用图像的局部特征为每个关键点匹配一个方向,下面是通过使用图像的梯度的方法实现的

    • 梯度直方图的生成
    • 特征点主方向的确定
      在该特征点领域的方向梯度直方图中,峰值方向就表示该关键点的主方向,为了增强匹配的鲁棒性,可以将值大于峰值 * 80%的方向作为该关键点的辅助方向,这样对于有多个峰值(主方向或辅助方向)的关键点邻域,将会在相同的空间位置产生多个空间位置相同但是方向不同的关键点(实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点)。以上操作将会使15%的关键点被赋予多个方向,但是可以明显地提高关键点匹配的稳定性,此处需要注意的是:离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值。
      具体过程

经过以上步骤我们就找到了关键点的三个信息:位置、所在尺度、方向,由此可以生成SIFT特征。

  • 图解4:特征点描述符
    特征点描述符创建的前提是:已经检测到了图片中的关键点(位置、所在尺度、方向),要求是:其不随光照、视角、图片缩放等变化而变化,而且有较高的区分度。
    • 特征描述子的生成过程

      • 确定计算描述子所需的区域
        将关键点的邻域划分为d*d(Love建议d = 4)个子区域,每个子区域作为一个种子点,每个种子点8个方向,**考虑到实际计算时,需要采用三线性插值,所需图像窗口边长为3x3xσ_oct x(d+1) **,再考虑旋转因素,所以实际计算时的区域如下:
        常见的特征点算法(检测+描述子)_第6张图片

        其中
      • 坐标轴旋转至主方向(确保旋转不变性)


        常见的特征点算法(检测+描述子)_第7张图片
      • 生成梯度直方图
        将邻域内的采样点分配到对应的子区域内,将子区域内的梯度值分配到8个方向上,计算其权值。


        常见的特征点算法(检测+描述子)_第8张图片
      • 三线性插值
        三线性插值:x_线、y_线、角度_线(8个值)


        常见的特征点算法(检测+描述子)_第9张图片

        采样点在子区域中的下标(x'',y'')(图中蓝色窗口内红色点)线性插值,计算其对每个种子点的贡献。如图中的红色点,落在第0行和第1行之间,对这两行都有贡献。对第0行第3列种子点的贡献因子为dr,对第1行第3列的贡献因子为1-dr,同理,对邻近两列的贡献因子为dc和1-dc,对邻近两个方向的贡献因子为do和1-do。则最终累加在每个方向上的梯度大小为:



        其中k,m,n为0(像素点超出了对要插值区间的四个邻近子区间所在范围)或为1(像素点处在对要插值区间的四个邻近子区间之一所在范围)。
      • 特征描述子
        如上统计的448=128个梯度信息即为该关键点的特征向量。
        特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理,对于图像灰度值整体漂移,图像各点的梯度是邻域像素相减得到,所以也能去除。得到的描述子向量为H=(h1,h2,.......,h128),归一化后的特征向量为L=(L1,L2,......,L128),则
      • 特征描述子的门限化
        非线性光照,相机饱和度变化对造成某些方向的梯度值过大,而对方向的影响微弱。因此设置门限值(向量归一化后,一般取0.2)截断较大的梯度值(大于0.2的则就令它等于0.2,小于0.2的则保持不变)。然后再进行一次归一化处理,提高特征的鉴别性。
    • 描述子生成过程


      常见的特征点算法(检测+描述子)_第10张图片

你可能感兴趣的:(常见的特征点算法(检测+描述子))