HOG特征
方向梯度直方图(Histogram of Oriented Gradients),或俗称的HOG
特征描述子的作用:它是图像的简化表示,仅包含有关图像的最重要信息。
- HOG描述符关注对象的结构或形状。现在你可能会问,这和我们为图像提取的边缘特征有什么不同?在边缘特征的情况下,我们只识别像素是否是边缘。HOG还能够提供边缘方向。这是通过提取边缘的梯度和方向(或者你可以说大小和方向)来实现的
- 此外,这些方向是在“局部”进行部分计算的。这意味着整个图像被分割成更小的区域,对于每个区域,计算梯度和方向。
- 最后,HOG将分别为这些区域生成一个直方图。直方图是使用像素值的梯度和方向创建的,因此得名“方向梯度直方图”。
HOG特征描述子计算图像局部区域中梯度方向的出现次数
如何从头开始创建HOG特征:
考虑下面的尺寸图像(180 x 280)。让我们详细了解如何为此图像创建HOG特征:

第一步:预处理数据(64x128)
这是大多数人都非常熟悉的一步。预处理数据是任何机器学习项目中的关键步骤,即使在处理图像时也没有什么不同。
我们需要对图像进行预处理,并将宽高比降低到1:2。图像大小最好是64 x 128。这是因为我们将图像分成88和1616小块来提取特征。具有指定的大小(64 x 128)将使我们的所有计算相当简单。事实上,这正是原始论文中使用的值。
回到我们的例子,让我们将大小为64x128作为目前的标准图像大小。以下是调整后的图像:

第二步:计算梯度(x和y方向)
下一步是计算图像中每个像素的梯度。梯度是x和y方向上的小变化。这里,我要从图像中取一小块,然后计算它的梯度:

我们将得到这个部分的像素值。假设我们为给定的部分生成下面的像素矩阵(这里的矩阵只是作为一个例子,这些并不是给定部分的原始像素值):

我突出显示了像素值85。现在,要确定x方向上的梯度,我们需要从右边的像素值减去左边的值。类似地,为了计算y方向的梯度,我们将从所选像素上的像素值减去下面的像素值。
因此,该像素的x和y方向的梯度为:
X方向的变化($G_x$)= 89-78 = 11Y方向的变化($G_y$)= 68-56 = 8这个过程将给我们两个新的矩阵,一个在x方向上存储梯度,另一个在y方向上存储梯度。这类似于使用大小为1的Sobel内核。当发生剧烈变化时(例如在边缘附近),幅值(magnitude)会更高。
我们分别计算了x和y方向的梯度。对图像中的所有像素重复相同的过程。下一步是使用这些值找到幅值和方向。
第三步:计算幅值和方向
使用我们在最后一步中计算的梯度,我们现在将确定每个像素值的大小和方向。对于这一步,我们将使用勾股定理(是的,与你在学校学习的那个相同!)。
看看下面的图片:

在之前的例子中,Gx和Gy分别是11和8。应用勾股定理计算总梯度大小:
总梯度幅值=√[(G_x)^2 +(G_y)^2]总梯度幅值=√[(11)^2 +(8)^2]= 13.6接下来,计算相同像素的方向。我们知道我们可以把角度写成tan
tan(Φ)= Gy/Gx
因此,角度的值将是:
Φ= atan(Gy/Gx)
当我们代入这些值时,角度是36°。现在,对于每个像素值,我们有总梯度(幅值)和方向。我们需要使用这些梯度和方向生成直方图。
但是请稍等——在深入研究HOG特征描述子中如何创建直方图之前,我们需要稍作休息。把这看作是整个过程中的一小步。我们将首先讨论一些简单的方法来创建直方图使用两个值,梯度和方向。
使用梯度和方向创建直方图的不同方法
直方图是显示一组连续数据的频率分布的图。变量(以箱子的形式)在x轴上,频率在y轴上。这里,我们设x轴上为角度,y轴为频率。
方法1:
让我们从生成直方图的最简单方法开始。我们将取每个像素值,找到像素的方向并更新频率表。
下面是高亮像素(85)的处理过程。由于该像素的角度为36°,我们将对角度值36添加一个数字,表示频率:

对所有像素值重复相同的过程,最后得到一个频率表,表示角度以及这些角度在图像中的出现情况。这个频率表可用于生成在x轴上有角度值的直方图和在y轴上有频率值的直方图。
这是创建直方图的一种方法。注意,这里直方图的bin值(角度的间隔)为1。因此我们得到大约180个不同的桶,每个桶代表一个角度值。另一种方法是为更大的角度值间隔创建直方图特征。
方法2:
这个方法与前面的方法类似,不同之处在于我们的bin值为20。因此,我们在这里得到的桶数是9。
同样,对于每个像素,我们将检查角度,并以9 x 1矩阵的形式存储角度值的频率。绘制这个将给我们直方图:

方法3:
上述两种方法仅使用角度值来生成直方图,并且不考虑梯度值。这是我们可以生成直方图的另一种方式 - 我们可以使用梯度幅值(magnitude)来填充矩阵中的值,而不是使用频率。以下是示例:

方法4:
让我们对上面的方法做一个小修改。在这里,我们将像素梯度的贡献添加到像素梯度两侧的区间。请记住,更接近角度的bin值有更高的贡献。

这正是在HOG特征描述子中创建直方图的方式。
第4步:计算8×8单元(9×1)中梯度的直方图
HOG特征描述子中创建的直方图不会为整个图像生成。将图像分割为8×8个单元格,计算每个单元格的方向梯度直方图。
通过这样做,我们得到了代表整个图像的小块的特征(或直方图)。我们当然可以把这个值从8 x 8换成16 x 16或者32 x 32。
如果我们将图像划分为8×8个单元格并生成直方图,我们使用我们在上一节中讨论的方法4生成该矩阵,将为每个单元格获得9 x 1矩阵。

一旦我们为图像中的8×8小块生成了HOG,下一步就是对直方图进行标准化。
步骤5:将16×16单元(36×1)中的梯度标准化
在我们理解这是如何做到的之前,首先理解为什么要这样做是很重要的。
虽然我们已经为图像的8×8单元创建了HOG特征,但是图像的梯度对整体光照很敏感。这意味着对于特定的图像,图像的某些部分与其他部分相比会非常明亮。
我们不能从图像中完全消除这个。但是我们可以通过使用16×16个块来对梯度进行归一化来减少这种光照变化。下面的例子可以解释如何创建16×16块:

在这里,我们将组合四个8×8单元来创建一个16×16块。并且我们已经知道每个8×8单元具有用于直方图的9×1矩阵。因此,我们将有四个9×1矩阵或一个36×1矩阵。为了标准化该矩阵,我们将这些值中的每一个除以值的平方和的平方根。在数学上,对于给定的向量V:
V = [a1,a2,a3,... a36]
我们计算平方和的根:
k =√(a1)2+(a2)2+(a3)2+ .... (A36)2
并将向量V中的所有值除以此值k:

结果将是尺寸为36×1的归一化向量。
第6步:完整图像的特征
我们现在正处于为图像生成HOG特征的最后一步。到目前为止,我们已经为16×16块图像创建了特征。现在,我们将结合所有这些来获得最终图像的特征。
你能猜出我们将为给定图像提供的特征总数是多少?我们首先需要找出一个64×128图像可以得到多少这样的16×16块:

我们将有105(7×15)块16×16。这105个块中的每一个都具有36×1的向量作为特征。因此,图像的总特征将是105×36×1 = 3780个特征。
ref:https://baijiahao.baidu.com/s?id=1646997581304332534&wfr=spider&for=pc