项目:基于MATLAB的HOG特征提取原理与代码详解系统
项目简介
本项目主要用于全面总结并深入解析方向梯度直方图(Histogram of Oriented Gradients, HOG)算法。不同于仅调用MATLAB工具箱函数的常规做法,本系统通过底层代码手动复现了HOG算法的每一个标准步骤,从图像预处理到最终的特征向量生成,旨在帮助用户理解算法内核。同时,项目提供了特征可视化功能以及简单的SVM分类器数据流模拟,展示了该特征在物体检测(特别是行人检测)中的实际应用流程。
功能特性
- 算法底层复现:不依赖
extractHOGFeatures函数,手动实现了梯度计算、Cell直方图统计、Block归一化等核心步骤。 - 详细的参数解析:代码中通过变量明确展示了CellSize(8x8)、BlockSize(2x2)、NumBins(9)以及Gamma校正系数等参数对算法的影响。
- 直观的特征可视化:能够在图像上根据计算出的梯度直方图绘制特征线段,直观展示局部区域的梯度方向和强度。
- 工具箱对比验证:内置校验机制,将手动实现的特征维度与MATLAB官方计算机视觉工具箱的结果进行对比,验证实现的正确性。
- 分类器工作流模拟:演示了如何将高维HOG特征向量输入到SVM分类器中进行训练和预测。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(必须,用于图像读取、调整大小、滤波)
- Computer Vision Toolbox(可选,用于
extractHOGFeatures对比验证) - Statistics and Machine Learning Toolbox(可选,用于
fitcsvm模拟演示)
使用方法
直接在MATLAB环境中运行主脚本即可。系统将依次执行以下流程:
- 读取并显示处理后的图像。
- 计算并显示梯度幅值图与方向图。
- 在控制台输出Cell、Block的尺寸及最终特征向量的维度信息。
- 弹出特征可视化窗口。
- 在控制台打印模拟SVM分类的训练与预测结果。
代码实现逻辑与细节详解
本项目的主脚本逻辑严格遵循HOG算法的标准论文流程,具体步骤分析如下:
1. 图像读取与预处理
- 输入处理:默认读取内置图像
peppers.png,若读取失败则生成随机噪声图像作为替代。 - 尺寸归一化:将图像强制调整为经典的行人检测窗口大小
128x64(行x列),确保后续Cell和Block划分的整除性。 - 灰度化与浮点转换:将RGB图像转换为灰度图,并将像素值归一化到
[0, 1] 的double类型。 - Gamma校正:采用平方根校正(Gamma=0.5),即对像素值开方。这一步旨在压缩图像动态范围,降低局部阴影和光照变化对特征提取的影响。
2. 梯度计算 (Gradient Calculation)
- 梯度算子:不使用高斯平滑,直接采用
[-1, 0, 1] 的一维离散差分模板(Sobel算子的简化版)分别计算水平梯度(dx)和垂直梯度(dy)。 - 幅值与方向:通过
sqrt(dx^2 + dy^2) 计算梯度幅值,通过 atan2 计算梯度方向。 - 无符号处理:将梯度方向从
[-180, 180] 映射到 [0, 180) 区间(Unsigned Gradient)。这意味着亮到暗与暗到亮的边缘被视为同一方向,这在行人检测中通常能提升效果。
3. Cell构建与直方图统计 (Cell Histograms)
- 网格划分:将图像划分为
8x8 像素的单元格(Cell)。 - 投票机制:采用了基础的“硬投票”(Hard Binning)策略。遍历Cell内的每一个像素,根据其梯度方向判断属于9个方向Bin中的哪一个(每20度一个Bin),并将该像素的梯度幅值累加到对应的Bin中。
- 输出:生成一个三维矩阵,记录了所有Cell在9个方向上的梯度累加值。
4. Block归一化 (Block Normalization)
- Block定义:将相邻的
2x2 个Cell组合成一个Block(即每个Block包含36个特征值)。 - 滑动窗口:Block以1个Cell为步长在图像上滑动(重叠率50%)。
- L2-Hys归一化:为了消除光照和背景对比度的影响,对每个Block的特征向量执行严格的归一化流程:
1. 计算向量的L2范数进行初次归一化。
2.
截断处理:将归一化后的数值限制在0.2以内(Clipping),以抑制过强梯度的影响。
3. 再次进行L2范数归一化。
- 向量生成:将所有Block归一化后的特征串联,形成最终的高维HOG特征向量。
5. 功能模块实现细节
- 工具箱对比验证 (
checkToolbox):如果环境包含Computer Vision Toolbox,脚本会调用 extractHOGFeatures,并设置相同的CellSize、BlockSize和NumBins,对比两者的特征向量长度。这用于验证手动计算的维度逻辑是否符合标准。 - 特征可视化 (
visualizeHOG):这是一个自定义绘图函数。它遍历统计好的Cell直方图,对于幅值超过一定阈值的Bin,在原图对应的Cell中心位置绘制一条黄色线段。线段的方向对应梯度方向,长度对应梯度强度,从而直观展示图像边缘的流向。 - SVM工作流模拟 (
simulateSVMworkflow):
* 为了演示特征如何被使用,该模块并没有使用前文提到的单张图片特征进行训练,而是生成了100个包含随机噪声的
模拟正负样本。
* 若检测到统计工具箱,会调用
fitcsvm 训练一个线性核SVM模型,并模拟对新样本的预测过程(输出分类标签和置信度得分)。
* 此环节展示了完整的“图像 -> HOG特征向量 -> SVM超平面 -> 判定结果”的数据流转逻辑。