图像特征之HOG(Histogram of Oriented Gradients)方向梯度直方图

概述

HOG(Histogram of Oriented Gradients)方向梯度直方图是图像识别的一个常用特征。其基本思路是计算图片的图像梯度,从而检测出边缘,再将图像梯度进行归纳和缩减,减少特征向量的维度。有了这个特征向量,后面就可以用学习算法进行训练和识别。

1.划分8*8小块并计算图像梯度

HOG的计算过程第一步,先将图像划分为8*8的小块,针对每个小块的每一个像素,都可以计算得到一个图像梯度,这个图像梯度有一个角度angle(0-180度)(方向)和一个大小magnitude(绝对值)。角度表示颜色变化的方向,而大小表示颜色变化的剧烈程度。
如何计算图像梯度可以看我的上一篇博客
下图是一个图像梯度计算示例。
图像划分成8*8并计算图像梯度

上图中共有左中右三部分,分别有不同的含义,下面分别加以说明。
最左面是原始图片,被分成8 * 8的小方块。注意红色框出的是后面要进行示例计算的一个小块。
中间的图是红色框出来的小方块的放大图,共 8 * 8 =64个像素,每一个小格是一个像素。每个像素上用箭头标出和图像梯度,箭头方向表示梯度角度,箭头长度表示梯度大小。
最右面的图是这个8 * 8小方块计算得到的图像梯度的大小(上面表格)和角度(下面表格)。

有了这个8 * 8小块的图像梯度以后,下面就可以计算HOG了。

2.根据图像梯度计算HOG

目前为止得到了图像梯度,一个8 * 8的小方块需要8 * 8 * 2=128个数值来描述它。这个数量太大,计算耗时太久。HOG可以将这128个数值缩小到9个数值,同时还保留了主要特征,去除了干扰噪声。下面来说一下具体思路和步骤。
首先,将图像梯度的角度按照每20度一个区间,划分为共9个区间,分别是0/20/40/60/80/100/120/140/160,其基本思想是图像梯度不必要那么精确,大致有个20度的方向就足够了。这样就得到了一个长度为9的数组,数组每个元素(称为bin)代表一个角度。
其次,针对8*8这个方块的64个像素及其图像梯度,逐个增加到9个bin。具体做法是,针对一个像素,它都有一个大小和角度,如果这个角度正好对应于9个bin的某一个,那么将它的大小值直接加到那个bin上;如果这个角度不等于某个bin,则它必须介于某2个bin之间,则根据角度与这2个bin的接近程度,将magnitude拆分成2部分,分别加到相邻的2个bin上。如下图所示。

根据图像梯度计算HOG过程
上图中,演示了2个像素的计算过程:蓝色圈和红色圈的像素。蓝色圈方向为80度,大小为2,由于角度能直接对应到bin,所以其绝对值2直接加到了80的bin上。红色圈角度为10,大小为4,由于角度不能直接对应到某个bin,而是介于0和20之间,所以将其绝对值4拆分成2部分(2个2),分别加到了0和20的bin上。为什么拆分成2个2而不是1.5和2.5或者其他,因为10这个角度距离0和20都一样远,所以拆分出来的量也是一样大。
如果角度大于160度,那么认为这个角度是介于160和0之间,同样的处理方法去拆分到160和0这两个bin。如下图。
图像梯度角度大于160时拆分为160和0
上面这8*8的小块计算完成后,就得到了一个方向梯度直方图,如下图。为什么叫直方图,就是从这里来的,就是一个不同角度方向分布的直方图啊。
方向梯度直方图

3.正则化

到目前为止所求得的HOG是对图像亮度敏感的,例如,还是这幅图,整体变暗了,那么所有像素的绝对值都变小了,根据上面计算过程(上面的计算过程全部都是对像素值的线性运算),可以知道,HOG的数值就会变小。为了消除图像亮度对HOG的影响,需要进行正则化。
HOG采用的正则化方法是使用一个16 * 16的方块,这个方块共有4个8 * 8的小方块,也就是有4 * 9=36个bin,求得这36个元素的平方和的平方根称为r,将每个小方块的9个bin值都除以这个r,就实现了正则化。
在对整张图进行正则化的过程中,一个16 * 16的块称为一个窗口,这个窗口每次移动8个像素,实现对整个图像的全覆盖,求得整个图像的全部HOG。
窗口移动过程如下图所示。
窗口移动过程

4.最终HOG向量维度

典型图片为64×128像素,对其求HOG,最后得到的向量是多少维的呢?
窗口大小16,每次移动8像素,所以在水平方向上可以移动7次,在垂直方向上可以移动15次,一共得到了7 * 15=105个,而每个方块有4 * 9=36个数值表示,所以最终的HOG向量共包含105 * 36=3780个数值,也就是HOG是一个3780维的向量。

后续

这个3780维的向量就是提取出来的特征了,将其输入一些学习算法,例如SVM/KNN什么的,就可以进行学习训练了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
方向梯度直方图Histogram of Oriented Gradients,HOG)是一种常用的图像特征提取方法,在物体检测和识别中广泛应用。下面我将简单介绍如何使用MATLAB进行HOG特征提取。 首先,我们需要加载图像,并将其转换为灰度图。使用MATLAB的imread函数读取图像,并将其转换为灰度图像,可以使用rgb2gray函数实现。 然后,我们使用MATLAB的gradient函数计算图像的水平梯度和垂直梯度。这可以通过以下代码实现: [dx, dy] = gradient(image_gray); 接下来,我们可以计算每个像素点的梯度幅值和梯度方向。可以使用以下代码实现: grad_magnitude = sqrt(dx.^2 + dy.^2); grad_direction = atan2(dy, dx); 然后,我们需要将图像划分为小的区域(Cell)。每个Cell中包含多个像素点。例如,可以将图像划分为16x16像素的Cell,可以使用MATLAB的mat2cell函数实现。 接下来,我们需要计算每个Cell中的梯度方向直方图。我们将梯度方向划分为多个方向的bins(例如8个bins),然后使用MATLAB的histcounts函数计算每个bin中梯度方向的数量。 最后,我们需要将所有Cell中的梯度方向直方图连接起来,形成最终的特征向量。可以使用MATLAB的reshape函数将所有直方图连接起来。 综上所述,通过上述步骤,我们可以使用MATLAB实现方向梯度直方图特征提取。特征提取后的HOG向量可以用于物体检测和识别任务,例如使用支持向量机进行分类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值