来源
https://www.analyticsvidhya.com/blog/2019/09/feature-engineering-images-introduction-hog-feature-descriptor/
参考
方向梯度直方图(HOG,Histogram of Gradient)学习笔记二 HOG正篇
http://blog.sina.com.cn/s/blog_60e6e3d50101bkpn.html
方向梯度直方图(HOG)
https://www.jianshu.com/p/6f69c751e9e7
这篇文章包含针对cell(单元) block(块)window(窗口) image(图像) 步长(stride)的解析,很清楚!
https://cloud.tencent.com/developer/article/1010111
基于python-opencv的HOG特征提取和使用cv2.HOGDescriptor()
https://blog.youkuaiyun.com/qq_36852276/article/details/94293375
总览
1.了解HOG功能描述符背后的内部原理和数学
2.HOG特征描述符在计算机视觉中广泛用于对象检测
3.适用于所有计算机视觉爱好者的有价值的功能工程指南
目录
1.什么是特征描述符?
2.HOG特征描述符简介
3.HOG的计算过程
3.1预处理数据
3.2计算梯度
3.3计算梯度幅值和方向
4.使用梯度和方向创建直方图的方法
5.HOG的计算过程
5.1计算梯度直方图
5.2归一化梯度
5.3完整图像的特征
6.在Python中实现HOG特征描述符
1.什么是特征描述符
对于下面这两幅图像,您可以区分图像中的对象吗?

我们可以清楚地看到,右图有一条狗,而左图有一辆车。现在,让我使此任务稍微复杂一些,确定下图所示的对象:

相比之下。第一幅图像具有很多信息,例如对象的形状,颜色,边缘,背景等;第二幅图像信息则只有形状和边缘,但是我们仍然可以识别两个物体。这是为什么,因为它任然具有识别对象所需的必要信息,而这正是特征描述符的作用:
特征描述符是图像的简化表示,仅包含有关图像的最重要信息,足够我们识别图像。
当前比较流行的特征描述符:
HOG:定向梯度直方图
SIFT:尺度不变特征变换
SURF:加速的强大特征
本文重点介绍HOG特征描述符及其工作方式
2.HOG特征描述符简介
HOG或定向梯度直方图是一种特征描述符,通常用于从图像数据中提取特征。它广泛用于计算机视觉任务中的对象检测。
让我们看一下HOG的一些重要方面,使其与其他特征描述符有所不同:
- HOG描述符着重于对象的结构或形状。现在您可能会问,这与我们从图像提取的边缘特征有何不同?对于边缘特征,我们仅识别像素是否为边缘。HOG能够提供边缘方向,这是通过提取边缘的梯度和方向来完成的。
- 另外,这些取向是在“局部”中计算的。这意味着将完整图像分解为较小的区域,并针对每个区域计算梯度和方向。我们将在接下来的部分中对此进行更详细的讨论。
- 最后,HOG将分别为这些区域中的每个区域生成直方图。使用像素值的梯度赋值和方向创建直方图,因此名称为“定向梯度直方图”
HOG特征描述符针对图像的各个部分中梯度取向的出现进行计数。
3.定向梯度直方图(HOG)的计算过程
考虑下面的图像尺寸(180 x 280)。让我们详细了解如何为该图像创建HOG特征:

3.1预处理数据
我们需要预处理图像并将宽高比降低到1:2。图像大小最好为64 x128。这是因为我们将图像分为8 * 8和16 * 16的方阵以提取特征。指定大小(64 x 128)将使我们所有的计算变得非常简单。实际上,这是原始纸张中使用的确切值。
让我们现在将64 x 128的尺寸作为标准图像尺寸。这是调整大小后的图像:

3.2计算梯度
下一步是计算图像中每个像素的梯度。梯度是x和y方向的微小变化。在这里,我将从图像中提取一个小补丁,并据此计算梯度:

我们将获得此补丁的像素值。假设我们为给定补丁生成了以下像素矩阵(此处显示的矩阵仅用作示例,而并非给定补丁的原始像素值):

我已经突出显示了像素值85。现在,要确定x方向上的梯度(或大小变化),我们需要从右侧的像素值中减去左侧的值。同样,要计算y方向上的梯度,我们将从所选像素上方的像素值中减去下方的像素值。
因此,此像素在x和y方向上的合成梯度为:
- X方向变化 Grad_x = 89 – 78 = 11
- Y方向变化 Grad_y = 68 – 56 = 12
此过程将为我们提供两个新的矩阵-一个在x方向上,另一个在y方向上。这类似于使用大小为1的Sobel内核。当强度发生急剧变化(例如在边缘附近)时,幅度将更高。
我们已经分别计算了x和y方向上的梯度。对图像中的所有像素重复相同的过程。下一步将是使用这些值找到梯度和方向。
3.3计算梯度幅值和方向
使用我们在上一步中计算出的梯度,现在我们将确定每个像素值的大小和方向。对于这一步,我们将使用pythagoras定理。
如下图:

此处的渐变基本上是基础且垂直。因此,对于前面的示例,我们将G_x和G_y分别设置为11和8。让我们应用pythagoras定理来计算总梯度大小:
总体梯 = √[(G_x)^2
+(G_y)^2 ]
总梯度=√[(11)^2 + (12)^2] = 16.27
接下来,计算同一像素的方向(或方向)。我们知道我们可以将角度用反三角函数表示:
tan(φ) = G_y / G_x
因此,角度值将为:
φ = arctan(G_y/G_x)
对于角度值小于0的这样计算

我们可以得到该角度值为45,现在,对于每个像素值,我们都有总梯度幅值和方向。我们需要使用这些梯度幅值和方向来生成直方图。
4.使用梯度和方向创建直方图的方法
直方图是显示一组连续数据的频率分布的曲线图。我们在x轴上表示角度值,在y轴上表示取得对应角度的个数(频数)。
4.1方法1
让我们从生成直方图的最简单方法开始。我们将获取每个像素值,找到像素的方向并更新频率表。
这是高亮像素(85)的处理。由于此像素的角度值是45,我们将针对角度值45添加一个1。(图片数字错误,45处对应为1)

对所有像素值重复相同的过程,最后得到一个频率表,该频率表表示角度以及图像中这些角度的出现。
4.2方法2
此方法与先前的方法相似,不同之处在于此处的箱大小为20。因此,此处要获得的存储桶数为9。
同样,对于每个像素,我们将检查方向,并以9 x 1矩阵的形式存储方向值的频率。绘制此图可得出直方图:(图片数字错误,40处对应为1)

4.3方法3
以上两种方法仅使用角度值来生成直方图,而没有考虑梯度值。这是我们可以生成直方图的另一种方法,而不是使用频率,而是可以使用梯度来填充矩阵中的值。下面是一个示例:(图片数字错误,40处对应为16.27)

行人检测结果

4.4 方法4
让我们对上述方法进行一些小的修改。在这里,我们将像素梯度的贡献添加到像素梯度任一侧的bin上。请记住,对bin值的贡献越大,该bin值就越靠近方向。(图片数字错误,40处对应为16.27)
Magnitude = 16.27
orientation = 45
(45-20)/2016.7 对应到20
(60-45)/2016.7 对应到0

5.HOG的计算过程
5.1计算梯度直方图
在HOG特征描述符中创建的直方图不会针对整个图像生成。取而代之的是,将图像划分为8×8个像元,并为每个像元计算定向梯度的直方图。
这样,我们获得了较小色块的特征(或直方图),这些色块又代表了整个图像。我们当然可以在此处将此值从8 x 8更改为16 x 16或32 x 32。
如果将图像划分为8×8个单元l并生成直方图,则每个单元将获得9 x 1的矩阵。该矩阵是使用我们在上一节中讨论的方法4生成的。

一旦我们为图像中的8×8色块生成了HOG,下一步就是将直方图归一化。
5.2归一化梯度
尽管我们已经为图像的8×8单元创
理解HOG特征描述符:从图像处理到行人检测

本文深入介绍了HOG(方向梯度直方图)特征描述符,它是计算机视觉中用于对象检测的重要工具。HOG通过计算图像中每个像素的梯度和方向,创建局部直方图,然后对这些直方图进行归一化处理,形成最终的特征向量。在Python中,可以使用OpenCV库实现HOG特征的提取。HOG特征强调了图像的形状信息,对光照变化具有一定的鲁棒性,广泛应用于行人检测等领域。
最低0.47元/天 解锁文章
3594

被折叠的 条评论
为什么被折叠?



