这是创建直方图的一种方法。注意,这里直方图的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个特征。
我们现在将为单个图像生成HOG特征,并验证我们是否在最后获得相同数量的特征。
在Python中实现HOG特征描述子是时候实现了!我敢肯定,这是本文中最受期待的部分。让我们开始吧。