文章简介

本文深入解析方向梯度直方图(HOG)特征的核心原理、优势,以及从灰度化、Gamma校正到特征拼接的完整提取流程,并结合Python实践说明其在行人检测中的应用逻辑——作为2005年Dalal提出的经典框架,HOG+SVM至今仍是许多检测算法的基础。

一、什么是HOG特征?

方向梯度直方图(Histogram of Oriented Gradient, HOG)是计算机视觉中物体检测的经典特征描述子,通过统计图像局部区域的梯度方向密度分布,来刻画目标的外观与轮廓。

2005年法国学者Dalal在CVPR上提出的「HOG+SVM」行人检测框架,至今仍是许多检测算法的基础——即使深度学习兴起,HOG的“局部统计+归一化”思想仍被轻量化模型借鉴。

1. HOG的核心思想

图像中局部目标的形状与表象,能通过「梯度(或边缘)的方向密度分布」有效描述:

  • 梯度本身集中在边缘区域(比如行人的轮廓、衣物纹理);
  • 统计梯度方向的分布,相当于用“方向直方图”编码了目标的形状特征。
    在这里插入图片描述

2. HOG的性能优化关键

为提升鲁棒性,HOG引入块(Block)级别的对比度归一化:将局部细胞单元(Cell)的直方图置于更大的块中,先计算块内直方图的密度,再用该密度对块内所有Cell的直方图做归一化。这一步能消除光照变化、阴影的影响。

3. HOG的优势(为何适合行人检测?)

  • 形变鲁棒性:基于局部方格单元的操作,对图像的**几何形变(如缩放)光学形变(如光照不均)**不敏感——这些形变通常影响更大的空间范围;
  • 动作容忍性:在“粗空域抽样+精细方向抽样+强局部归一化”的条件下,只要行人保持直立姿势,细微肢体动作(如挥手、抬腿)不会干扰检测;
  • 计算高效:梯度计算、直方图统计均为线性操作,适合实时检测场景。

二、HOG特征的完整提取流程

HOG的提取过程可概括为7步,核心逻辑是“局部统计→块归一化→全局拼接”:

  1. 图像灰度化;
  2. Gamma空间归一化;
  3. 计算像素梯度(大小+方向);
  4. 划分细胞单元(Cell);
  5. 统计Cell的梯度方向直方图;
  6. 块(Block)的归一化与特征拼接;
  7. 全局HOG特征的生成。

步骤1:Gamma空间与颜色空间标准化

光照变化是物体检测的最大干扰之一,因此需先对图像做归一化处理

  1. 灰度化:颜色信息对行人检测帮助有限,先将彩色图转为灰度图(仅保留亮度通道);
  2. Gamma校正:通过压缩图像的纹理强度,降低局部阴影与光照变化的影响。公式为:Igamma(x,y)=I(x,y)γI_{\text{gamma}}(x,y) = I(x,y)^\gammaIgamma(x,y)=I(x,y)γ其中γ\gammaγ常取1/2(即平方根压缩)——这一步能有效抑制高光区域的过度曝光。

步骤2:计算像素梯度

梯度是HOG的“原始特征”,能捕获图像的轮廓、纹理信息,并进一步弱化光照干扰。对于灰度图中的像素点(x,y)(x,y)(x,y)

  • 水平梯度GxG_xGx:用卷积核[−1,0,1][-1,0,1][1,0,1]计算(检测水平方向的边缘,如行人的左右轮廓);
  • 垂直梯度GyG_yGy:用卷积核[1,0,−1]T[1,0,-1]^T[1,0,1]T计算(检测垂直方向的边缘,如行人的上下轮廓);
  • 梯度大小G(x,y)=Gx(x,y)2+Gy(x,y)2G(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)=arctan⁡2(Gy(x,y),Gx(x,y))\theta(x,y) = \arctan2(G_y(x,y), G_x(x,y))θ(x,y)=arctan2(Gy(x,y),Gx(x,y))(范围0360°,或简化为0180°以减少计算量)。

步骤3:细胞单元(Cell)的梯度直方图统计

接下来将图像划分为互不重叠的小细胞单元(常见尺寸:6×6像素/Cell),并为每个Cell统计梯度方向直方图

  1. 方向分箱:将梯度方向(0~180°)均分为9个bin(每bin20°)——这是行人检测的最优设置(平衡计算量与特征区分度);
  2. 加权统计:每个像素的梯度方向会被分配到对应的bin中,而梯度大小则作为该bin的权重(例如:梯度方向25°属于第2个bin,梯度大小为2,则该bin计数+2);
  3. 特征向量:每个Cell最终生成一个9维特征向量(对应9个bin的统计值)。
    在这里插入图片描述

步骤4:块(Block)的归一化与特征拼接

由于局部光照和前景-背景对比度变化,Cell的直方图会出现梯度强度波动,需通过“块归一化”解决:

  1. 块的定义:将相邻的Cell组合成一个块(常见设置:2×2个Cell/Block),块之间重叠滑动(步长为1个Cell)——例如,2×2的Block会覆盖4个Cell;
  2. 特征拼接:将块内所有Cell的9维特征串联,得到一个36维向量(2×2×9);
  3. 归一化:对块内特征做L2范数归一化(或L1范数),公式为:vnorm=v∥v∥22+ϵv_{\text{norm}} = \frac{v}{\sqrt{\|v\|_2^2 + \epsilon}}vnorm=v22+ϵ v其中ϵ\epsilonϵ是极小值(避免除以0)。

块的重叠设计,让每个Cell的特征多次参与不同块的计算,能显著提升特征的鲁棒性。
在这里插入图片描述

步骤5:全局HOG特征的生成

最后,将检测窗口内所有重叠块的HOG描述符按顺序拼接,得到整个窗口的HOG特征向量——这就是供SVM等分类器使用的输入特征

三、HOG特征维数计算示例

以行人检测中常用的64×128像素输入图像为例,参数设置如下:

  • Cell尺寸:16×16像素(每个Cell包含16×16个像素);
  • Block尺寸:2×2个Cell/Block;
  • 块滑动步长:8像素(即步长为Cell大小的一半,重叠率50%);
  • Bin数量:9。

则特征维数计算如下:

  1. 每个Block的特征维数:2×2×9=362×2×9=362×2×9=36
  2. 水平方向的Block数量:64−168+1=7\frac{64-16}{8} +1 =786416+1=7
  3. 垂直方向的Block数量:128−168+1=15\frac{128-16}{8} +1 =15812816+1=15
  4. 全局特征维数:36×7×15=378036×7×15=378036×7×15=3780

这意味着,一张64×128的行人图像,最终会被转化为3780维的HOG特征向量

四、Python实现:快速提取HOG特征

在Python中,OpenCV库提供了cv2.HOGDescriptor类,可快速实现HOG特征提取——以下是行人检测的示例代码:

import cv2
import numpy as np

# 1. 读取图像并转为灰度图
img = cv2.imread("pedestrian.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2. 定义HOG参数(行人检测的经典设置)
win_size = (64, 128)    # 检测窗口大小(与训练数据一致)
block_size = (16, 16)   # 块大小(2×2 Cell)
block_stride = (8, 8)   # 块滑动步长(重叠50%)
cell_size = (8, 8)      # Cell大小(8×8像素)
nbins = 9               # 直方图Bin数量

# 3. 初始化HOG描述符
hog = cv2.HOGDescriptor(win_size, block_size, block_stride, cell_size, nbins)

# 4. 计算HOG特征
hog_features = hog.compute(gray)

# 输出特征维数(应等于3780)
print(f"HOG特征维数:{hog_features.shape[0]}")

五、HOG的优势与局限性

优势

  • 对形变鲁棒:基于局部Cell的操作,对图像缩放、旋转(小角度)不敏感;
  • 光照鲁棒:Gamma校正+块归一化,能有效抑制光照变化与阴影;
  • 计算高效:梯度计算、直方图统计均为线性操作,适合实时检测。

局限性

  • 对遮挡敏感:若行人被遮挡(如背包、雨伞),局部梯度信息会丢失;
  • 依赖目标姿势:仅对“直立行人”效果好,躺卧、弯腰等姿势会降低检测率;
  • 高维特征:3780维的特征向量,对分类器(如SVM)的计算速度有一定影响。

六、总结

HOG特征的本质,是通过“局部细胞单元的梯度直方图+块归一化+全局拼接”,将图像的形状特征转化为高维向量。这种设计让HOG既保留了局部细节,又对光照、形变鲁棒——因此成为行人检测的经典特征。

即使如今深度学习算法(如YOLO、Faster R-CNN)占据主导,HOG的“局部统计”思想仍被轻量化模型借鉴(如MobileNet的深度可分离卷积,本质是局部特征的高效提取)。

若你想入门计算机视觉的物体检测,HOG绝对是值得深入学习的“基础课”。

获取更多资料

欢迎下载学习资料,包含:机器学习,深度学习,大模型,CV方向,NLP方向,kaggle大赛,实战项目、自动驾驶等。
搜 “机器视觉与数据” 免费获取请添加图片描述
请添加图片描述
请添加图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐