【计算机视觉】方向梯度直方图(Histogram of Oriented Gradient,HOG)

2023-05-16

文章目录

    • 1. HOG 简述
    • 2. HOG 工作流程
      • 第一步、对图像的颜色空间进行归一化
      • 第二步、计算每个像素点的梯度
      • 第三步、为每个单元构建梯度方向直方图
      • 第四步、块内梯度直方图归一化
    • 3. 举个例子
    • 4. HOG 可视化

1. HOG 简述

HOG(Histogram of Oriented Gradient)方向梯度直方图是 Dalal 和 Triggs 在 2005 的 CVPR 上提出的一种解决人体目标检测的图像描述子,用于表征图像局部梯度方向和梯度强度分布特性。其具体思想是:在一副图像中,局部目标的形状能够被梯度或边缘的方向密度分布很好地描述。该方法通过统计局部区域的梯度方向直方图来构成特征,能够很好地描述人体的边缘,提取人体的外形信息和运动信息,形成丰富的特征集。Dalal 等提出的 HOG+SVM 算法当时在行人检测上取得了巨大的成功,而此后涌现的许多算法,大多是以该算法为基础框架。

2. HOG 工作流程

梯度方向直方图顾名思义就是计算图像中各像素的梯度方向,统计成为直方图作为特征表示目标。其大致有以下4步:
在这里插入图片描述

第一步、对图像的颜色空间进行归一化

因为图像的采集环境、装置等因素,采集到的图像效果可能不是很好,所以需要对采集到的图像进行预处理。其中包括:将图像灰度化和 Gamma 校正。使用 Gamma 校正法对输入图像进行颜色空间的标准化的目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰。

第二步、计算每个像素点的梯度

在HOG特征提取的过程中,梯度计算采用简单的水平边缘算子 [-1,0,1] 和垂直边缘算子 [-1,0,1]^T。通过与图像进行卷积操作来获得梯度信息。图像中某像素点 (x,y) 的梯度可以用如下公式计算:
G x ( x , y ) = H ( x + 1 , y ) − H ( x − 1 , y ) G y ( x , y ) = H ( x , y + 1 ) − H ( x , y − 1 ) G_x(x,y) = H(x+1,y)-H(x-1,y) \\ G_y(x,y) = H(x,y+1)-H(x,y-1) Gx(x,y)=H(x+1,y)H(x1,y)Gy(x,y)=H(x,y+1)H(x,y1)
G ( x , y ) = G x ( x , y ) 2 + G y ( x , y ) 2 G(x,y) = \sqrt{G_x(x,y)^2+G_y(x,y)^2} G(x,y)=Gx(x,y)2+Gy(x,y)2
θ ( x , y ) = a r c t a n G y ( x , y ) G x ( x , y ) \theta (x,y) = arctan\frac{G_y(x,y)}{G_x(x,y)} θ(x,y)=arctanGx(x,y)Gy(x,y)
公式中 x 表示水平方向,y 表示竖直方向,G 表示梯度的大小, θ \theta θ 表示梯度的方向。

第三步、为每个单元构建梯度方向直方图

这一步的目的是为局部图像区域提供一个编码,同时能够保持对图像中人体对象的姿势和外观的弱敏感性。将图像分成若干个大小相同的单元(cell),作者原文文将每个单元设置成 8x8 像素。原文将梯度方向每 20 度作为一个区间,平均分为 9 个区间(bin)(因为 tan 的周期为 π \pi π,所以分成 9 份),如下图所示:
在这里插入图片描述
在每个单元格中,以每个像素点处的梯度大小作为权值统计梯度方向区间的直方图。每个区间分别对应一定的角度范围,9 个区间即为直方图的横轴,而这些角度范围内所对应的梯度的累加值即为直方图的纵轴。

第四步、块内梯度直方图归一化

像素点、单元和区块之间的关系如下图所示。
在这里插入图片描述
将小的单元(cell)合并成大的区块(block),每个块内归一化梯度直方图即可得到该块的 HOG 特征。这么做是因为局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。一个块内所有单元的纵轴值串联起来归一化后得到的向量被称作该块 HOG 描述子。图像中所有块的 HOG 描述子串联起来即得到该图像的 HOG 特征向量。原文一个区块设置成 2x2 单元。

3. 举个例子

比如 INRIA 数据集中图像剪裁后的大小为 64x128,故每张图像共有 8x16 的单元(cell),每个单元(cell)有一个 9 维的特征向量,把一个块内的特征向量串联起来,所以每个区块(block)是 (2x2)x9=36 维,用块对样本图像进行扫描,扫描步长为一个单元(区块可以重叠),最后将所有块的特征串联起来,所以每张图像的HOG特征维度为:36x7x15=3780 。

4. HOG 可视化

在数据集 INRIA 中选择一个图像,将其剪裁为大小 64x128,按照上述 HOG 参数进行 HOG 可视化,效果如下:
在这里插入图片描述
可视化时将整个图像作为一个 Block 来使用,即 HOG 可视化图像展示的是图像中每个 cell 的梯度直方图,其中每条线的方向代表着这个单元内每个像素点的梯度方向。在图中可以发现,直方图的主要方向捕获了这个人的外形,尤其在躯干和腿。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机视觉】方向梯度直方图(Histogram of Oriented Gradient,HOG) 的相关文章

  • CSS3 是否支持在单个

    我知道你可以在一个背景上制作多个背景 div 在 CSS3 中 但是是否可以混合图像引用背景 即url 具有渐变生成背景 例如 moz linear gradient 如果是这样 语法是什么 如果不是 达到相同结果的最佳实践是什么 Than
  • HTML5画布覆盖透明渐变

    我正在 HTML5 中创建一个颜色选择器 如下面的渐变 它由三个要素组成 纯红色背景色 必须可变 从下到上黑 透明渐变 从左到右白色透明渐变 我已经成功创建了单个渐变和单个颜色 但我不知道如何将纯色和两个渐变叠加在一起 我怎样才能做到这一点
  • 有没有办法在 numpy.hist 中返回相同长度的数组?

    我正在尝试在 python 中创建直方图 用一些自定义值对 y 轴值进行标准化 为此 我想这样做 import numpy as np import matplotlib pyplot as plt data np loadtxt foo
  • 如何在 R 中绘制多个堆叠直方图?

    我对 R 非常陌生 今天才开始使用它 我试图在彼此之上绘制多个直方图 我遇到过一些关于如何在彼此之上绘制两个直方图的帖子 但没有找到任何解释如何执行多个直方图的帖子 具体来说 对于我的示例 5 我想绘制 5 个值的堆积直方图 a lt c
  • Gnuplot 列堆叠直方图 - 行/行计数

    我有一个数据文件 其中包含未定义数量的条目 如下所示 A B C D E 1 0 2 5 4 7 4 3 4 1 8 7 4 0 7 1 1 第一行代表工作时间 然后以交替的方式暂停等等 为了可视化这一点 我通过定义两种具有不同颜色的线条样
  • gnuplot 直方图上 Y 轴和条形之间的空间

    我有这样的 gnuplot 脚本 set term pos eps set style data histogram set style histogram clustered gap 1 set grid y set boxwidth 0
  • 用python计算梯度

    我想知道如何numpy gradient工作 我用梯度来尝试计算群速度 波包的群速度是频率相对于波数的导数 而不是一组速度 我向它提供了一个 3 列数组 前 2 列是 x 和 y 坐标 第三列是该点 x y 的频率 我需要计算梯度 我确实期
  • 在另一个绘图的绘图区域内添加小直方图

    有没有办法在另一个图的绘图区域内添加直方图 但独立于 基础 图的坐标系 就我而言 我想将直方图作为图例添加到分区统计图 直方图将显示属于每个类别的区域数量 但问题可以轻松应用于任何绘图 例如 plot 1 10 rect 1 7 4 9 c
  • 使用 CSS3 在文本上创建双色锐渐变

    我需要为我正在构建的网站上的标题和导航文本创建 锐利 渐变 我正在尝试使其尽可能纯 HTML5 CSS3 并且愿意坚持使用 font face而不是转移到Cufon 我所说的锐渐变是指两种颜色 两者之间没有混合 例子 http dl dro
  • R 直方图中的确切箱数

    我在 R 中制作直方图时遇到困难 问题是我告诉它制作 5 个容器 但它制作了 4 个 我告诉它制作 5 个 它制作了 8 个 data lt c 5 28 14 64 37 25 78 9 44 92 8 96 19 22 34 81 33
  • 更改选定直方图 bin 条的颜色(给定其值)

    类似于我之前问过的一个问题 https stackoverflow com questions 35780048 labelling a matplotlib histogram bin with an arrow 我有一个像这样的 MWE
  • iPhone 上 UIView 和 UILabels 上的渐变[重复]

    这个问题在这里已经有答案了 可能的重复 在 iPhone 应用程序中手动绘制渐变 https stackoverflow com questions 227005 manually drawing a gradient in iphone
  • 使用elasticsearch按一天中的时间累积流量

    我正在接收来自大量客户端应用程序的请求 事件 我想使用elasticsearch 来找出我的最高流量点是什么时候 我尝试过的一件事是使用嵌套直方图进行过滤器聚合 然后使用嵌套的 术语 聚合 通过脚本字段获取一天中的不同时间 以下是我的尝试
  • 将 R ggplot 中直方图中的 y 轴标准化为按组比例

    我的问题非常类似于将 R ggplot 中直方图中的 y 轴标准化为比例 https stackoverflow com questions 11766856 normalizing y axis in histograms in r gg
  • 用渐变色绘制一个 D3 圆

    如何用渐变颜色画一个圆 比如说 从黄色到蓝色的渐变 通常 要创建黄色圆圈 我们可以使用以下代码 var cdata 50 40 var xscale 40 var xspace 50 var yscale 70 var svg d3 sel
  • 使用 MapKit ios 绘制渐变折线

    我正在尝试使用叠加层 MKOverlay 跟踪 MKMapView 上的路线 但是 根据当前的速度 如果颜色发生变化 例如 如果用户从 65 英里每小时行驶到 30 英里每小时 则从绿色变为橙色 我希望在跟踪路线时执行类似 Nike 应用程
  • 如何绘制多面直方图(不是条形图)以及相对于每个面的百分比?

    虽然有几篇关于如何在条形图的每个方面使用缩放百分比的帖子 但我没有看到任何帖子显示如何在直方图中执行此操作 可以这样做吗 这是我研究过的两篇文章 所以帖子1 使用 ggplot2 获取反映各个方面的百分比比例 https stackover
  • createRadialGradient 和透明度

    我正在玩createRadialGradient 在 HTML5 画布上 它就像一个魅力 除非我试图实现 半 透明 我制作了这个 jsFiddle 是为了让事情变得更清晰 http jsfiddle net rfLf6 1 http jsf
  • 如何在 R 中只为直方图的一个标签着色?

    我有一个像这样的数据框 CellLines ZEB1 600MPE 2 8186 AU565 2 783 BT20 2 7817 BT474 2 6433 BT483 2 4994 BT549 3 035 CAMA1 2 718 DU447
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor

随机推荐