图像特征工程-HOG特征描述符学习笔记

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

来源

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)/20
16.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单元创

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值