Python实现HOG特征提取:从图像到梯度直方图

版权申诉
0 下载量 195 浏览量 更新于2024-08-25 收藏 589KB PDF 举报
"这篇文档是关于使用Python实现方向梯度直方图(Histogram of Oriented Gradients, HOG)的实战教程,主要来源于CSDN平台。文档详细介绍了如何通过OpenCV库处理图像,计算梯度,以及进行HOG特征提取的步骤。" 在计算机视觉领域,方向梯度直方图(HOG)是一种用于对象检测的强大特征描述符。HOG通过捕捉图像局部区域内的边缘和形状信息来识别和定位目标物体。下面是基于Python和OpenCV实现HOG的详细过程: 1. **读取图片** 使用`cv2.imread()`函数读取图像,可以设置参数0以读取灰度图像。`img2`是对原始图像进行归一化的版本,将像素值缩放到0到1之间,而`img1`保持原图像的8位整数格式。`image`则由`color.rgb2gray()`函数将彩色图像转换为灰度图像。 2. **计算梯度** - **x方向梯度**:使用`cv2.Sobel()`函数计算x方向的梯度。该函数接受输入图像、数据类型(在这里为`cv2.CV_32F`,即32位浮点数)、x方向的差分阶数(1表示向前一像素求导)和y方向的差分阶数(0表示仅计算x方向的梯度),以及可选的卷积核大小(在这里为1x1)。 - **y方向梯度**:同样使用`cv2.Sobel()`函数计算y方向的梯度,但这次改变y方向的差分阶数为1。 3. **计算合梯度的幅值和方向** 使用`cv2.cartToPolar()`函数将x和y梯度转换为极坐标形式,得到梯度的幅值(magnitude)和方向(angle)。`angleInDegrees=True`参数表示返回的角度以度为单位。 4. **可视化** 文档中的这部分代码用于展示各个步骤的结果,包括原始图像、x方向梯度图、y方向梯度图等,以便于理解图像处理的过程。`plt.figure(figsize=(30,30))`创建了一个宽30,高30的图像,`add_subplot()`函数添加了子图,并用`axis('off')`关闭了坐标轴显示。 5. **HOG特征提取** 虽然这部分代码没有展示完整的HOG特征提取,但在实际应用中,接下来的步骤通常会涉及: - **细胞单元格(Cell)划分**:将图像划分为小的单元格。 - **块(Block)与重叠**:多个相邻的单元格组成一个块,块之间可能有重叠。 - **梯度直方图**:在每个单元格内,根据梯度方向创建直方图。 - **归一化**:对块内的直方图进行局部归一化,以减少光照变化的影响。 - **形成特征向量**:组合所有块的直方图形成最终的HOG特征向量。 HOG特征在行人检测、车辆检测等应用场景中表现出色,但其计算复杂度较高,对于大规模图像处理可能会较慢。随着深度学习的发展,虽然HOG已不再是主流的特征提取方法,但它依然是理解和学习计算机视觉原理的重要工具。