HOG特征是图像处理中物体检测的特征描述子。计算的是图像局部区域的梯度方向直方图来构成特征,因为不同区域的梯度方向是不同的。这些特征结合SVM已经广泛应用于图像识别中。
主要思想:梯度或者边缘方向密度能够图像的轮廓信息,而且梯度主要存在于图像中的边缘部分。
具体的实现方法是:将图像划分成小的连通域,我们称之为细胞单元cell,然后计算细胞单元中各个像素点的梯度方向,构建梯度直方图,最后把这些直方图组合起来就可以构建为一个特征描述器。(所谓特征描述器我个人的理解就是:一种可以区分物体的东西,就是说有了这个特征描述器我便可以知道图中有没有我想找的物体)
这张图是具体的HOG特征提取的实现流程:
1.输入为一张普通的图像,首先进行灰度化。
2.对输入图像进行颜色空间标准化(归一化),目的是调节图像的对比度,降低图像局部的阴影和光照变化带来的影响,同时可以抑制噪声的干扰。
3.计算图像横坐标和纵坐标方向的梯度,并据此计算每个像素位置的梯度方向值;求导操作不仅能够捕获轮廓,人影和一些纹理信息,还能进一步弱化光照的影响。
图像中某一点像素的x,y方向的梯度分别为:
最常用的方法是:首先用[-1,0,1]梯度算子对原图像做卷积运算,得到x方向(水平方向,以向右为正方向)的梯度分量gradscalx,然后用[1,0,-1]T梯度算子对原图像做卷积运算,得到y方向(竖直方向,以向上为正方向)的梯度分量gradscaly。然后再用以上公式计算该像素点的梯度大小和方向。当然也有很多不同的卷积核去对x,y方向求梯度。
4.将图像化成小得cell,这个可以自己设置,比如每个cell都是包含5*5个像素点。
5.统计每个cell中的梯度方向直方图,结果就是每个cell的HOG特征。
我们将图像分成若干个“单元格cell”,例如每个cell为5*5个像素。假设我们采用9个bin的直方图来统计这5*5个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,(当然也有人用八个方向)如图所示:例如:如果这个像素的梯度方向是20-40度,直方图第2个bin的计数就加一,这样,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9个bin)。方向有了,那么梯度大小就是作为投影的权值的。例如说:这个像素的梯度方向是20-40度,然后它的梯度大小是2(假设啊),那么直方图第2个bin的计数就不是加一了,而是加2(假设啊)。
6.将几个cell联合起来组成一个块(block,比如一个block里包含3*3个cell),统计一个block的HOG特征。图中每个小格子是一个cell,这个3*3的大方格是一个block。由于局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。并且这些区间是互有重叠的,(为什么会有重叠呢?因为他这个block不是在图像上直接划分好的,而是类似于滑动串口一样,每次按照一定步长去滑过去的)这就意味着:每一个单元格的特征会以不同的结果多次出现在最后的特征向量中。我们将归一化之后的块描述符(向量)就称之为HOG描述符。
7.将图像中所有的block的HOG特征串联,便可得到该图像的HOG特征了,这个就是最终的可供分类的特征了。
(我是这么认为的:用人脸检测来举个例子,最开始的图像可能就是单纯的人脸,然后通过对这些人脸提取特征,当拿一张带有背景的人脸图片时,通过提取HOG特征,加上回归,可以找到人脸的位置,并标注出来。或者也可能是用了一种类似于区域提名的方式,先把有可能有人脸的地方圈出来,然后进行回归,确认这个地方到底有没有人脸,最后进行标注。)
总结一下HOG特征的提取过程:首先把灰度图分割为若干个cell,把梯度分为9个方向,对每一个cell做一个梯度方向的统计,然后构建block,把一定数目连通的cell构成一个block,在block去统计梯度方向,然后这个block按照一定步长将图像中所有的位置全都统计好,最后把这些特征融合,就得到了这一幅图的HOG特征。举个例子:拿一幅100*100的图片,每个cell包含5*5个像素点,每个cell的梯度方向有9个方向,然后美3*3个cell构成一个block,那么一个block中就包含了9*9=81个特征。水平和垂直方向都以5个像素为步长,那么一幅图将包含18*18个block,也就是说水平和垂直方向有都有18个扫描窗口,那么100*100的图像上总共有9*9*18*18=26244个特征。
【注】HOG是在图像场中计算的特征,属于spatial(空间)特征
HOF(Histogramsof Oriented Optical Flow)与HOG类似,是对光流方向进行加权统计,得到光流方向信息直方图。通常用于动作识别中。光流的概念是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。其计算方法可以分为三类:
(1)基于区域或者基于特征的匹配方法;(匹配一定区域或者特征点,然后分析这些特征点在某个方向上移动了多少)
(2)基于频域的方法;(我还不太了解)
(3)基于梯度的方法;(通过计算梯度得到图像的边缘,而运动物体必然有边缘,边缘的运动能够很好的描述物体的运动)
简单来说,光流是空间运动物体在图像上的像素运动的“瞬时速度”。光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的“运动”。研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。
光流法的前提假设:
(1)相邻帧之间的亮度恒定;(我的理解就是同一个物体反射回来的光不会变化很大,比如有闪光灯干扰)
(2)相邻视频帧的取帧时间连续,或者,相邻帧之间物体的运动比较“微小”;(就是说送入的图片必须看起来是连贯的,物体的位移不大)
如图所示,假设第一帧图面为H(x,y),第二帧图片为 I(x,y),那么如何计算其中像素点的运动呢?显然,对于H中的某一个特定点,我们应该在I中的相同位置的周围去寻找像素一致或接近一致的点。因此我们要有上面的两种假设,1,颜色一致,对于灰度图来讲就是亮度一致。2,运动微小,每个像素点都没有产生较大的偏移,否则在对应位置周围就找不到匹配的点了。
计算光流矢量与横轴的夹角,根据角度值将其投影到对应的直方图bin中,并根据该光流的幅值进行加权。
光流法用于目标检测的原理:给图像中的每个像素点赋予一个速度矢量,这样就形成了一个运动矢量场。在某一特定时刻,图像上的点与三维物体上的点一一对应,这种对应关系可以通过投影来计算得到。根据各个像素点的速度矢量特征,可以对图像进行动态分析。如果图像中没有运动目标,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体时,目标和背景存在着相对运动。运动物体所形成的速度矢量必然和背景的速度矢量有所不同,如此便可以计算出运动物体的位置。需要提醒的是,利用光流法进行运动物体检测时,计算量较大,无法保证实时性和实用性。
光流法用于目标跟踪的原理:
(1)对一个连续的视频帧序列进行处理;
(2)针对每一个视频序列,利用一定的目标检测方法,检测可能出现的前景目标;
(3)如果某一帧出现了前景目标,找到其具有代表性的关键特征点(可以随机产生,也可以利用角点来做特征点);
(4)对之后的任意两个相邻视频帧而言,寻找上一帧中出现的关键特征点在当前帧中的最佳位置,从而得到前景目标在当前帧中的位置坐标;
(5)如此迭代进行,便可实现目标的跟踪;
补充:
1.以横轴为基准计算夹角能够使HOF特征对运动方向(向左和向右)不敏感。
2.通过归一化直方图实现HOF特征的尺度不变性。
3.HOF直方图通过光流幅值加权得到,因此小的背景噪声对直方图的影响微乎其微。
4.通常直方图bin取30以上识别效果较好。
【注】HOF是在光流图像上得到的特征,算是时间(Temporal)特征。
对于HOG特征,其统计的是灰度图像梯度的直方图;对于HOF特征,其统计的是光流(包括方向和幅度信息)的直方图。而对于MBH特征,它的处理方法是将x方向和y方向上的光流图像视作两张灰度图像,然后提取这些灰度图像的梯度直方图。即MBH特征是分别在图像的x和y方向光流图像上计算HOG特征。
由上图可以看出,MBH特征的计算效果就是提取了运动物体的边界信息(也因此被称为Motion Boundary Histograms),在行人检测这个应用场景能起到不错的效果。此外,其计算也非常简单方便,易于使用。
【注】MBH是在光流图像的基础上得到的特征,算是时间(Temporal)特征。