1.概要
HOG (Histogram of Oriented Gradients) 是一种在计算机视觉和图像处理中广泛使用的特征描述符,主要用于对象检测、图像识别等领域。HOG 通过计算和统计图像局部区域的梯度方向直方图来构成特征。以下是 HOG 的主要步骤:
- 预处理:图像首先会被归一化为统一的尺寸(例如 64x128 像素),并转换为灰度图像。这一步是为了减少光照和阴影的影响。
- 计算梯度:在每个像素位置,计算水平和垂直方向的梯度。这通常通过卷积图像与特定的梯度算子(如 [-1, 0, 1] 和 [-1, 0, 1] 的转置)来实现。梯度的幅度和方向也被计算出来。
- 划分单元格:图像被划分为小的单元格(例如 8x8 像素)。在每个单元格内,计算梯度方向的直方图。直方图的bin数量(即方向的数量)是预先设定的,例如 9 个bin,每个bin覆盖 20 度的范围。
- 计算块直方图:将几个相邻的单元格组合成一个块(block),例如 2x2 个单元格。然后,在每个块内,对单元格的直方图进行归一化。归一化是为了减少光照和阴影的影响。块内的单元格可以是重叠的,这意味着一个单元格可以属于多个块。
- 收集HOG特征:最后,将所有块的直方图连接起来,形成一个长向量,这就是图像的HOG特征。
HOG特征的一个重要优点是它们对光照和阴影的变化具有一定的鲁棒性,因为直方图的归一化步骤可以减少这些变化的影响。此外,HOG特征还可以与其他特征(如颜色特征)结合使用,以提高对象检测和识别的准确性。
HOG最初是为行人检测而开发的,但后来被广泛应用于其他计算机视觉任务中,如面部识别、手势识别等。
2.原理举例
HOG(Histogram of Oriented Gradients)是一种常用的特征描述符,用于目标检测和识别。其主要思想是:在一个图像区域内,边缘方向的梯度比非边缘方向的梯度更能代表该区域的特征。
HOG特征提取的主要步骤如下:
将图像转换为灰度图。
将图像分割成小的连通区域,通常称为“块”或“单元”。
对每个块进行方向梯度的计算。
计算梯度方向的直方图,即HOG描述符。
将这些HOG描述符组合成一个大的特征向量,用于目标识别或检测。
以下是使用OpenCV库实现HOG算法的Python代码示例:
import cv2
import numpy as np
def hog_descriptor(image, pixel_per_cell=(8, 8), cell_per_block=(2, 2), bin_n=9):
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 计算图像的梯度
gx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=-1)
gy = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=-1)
# 计算梯度方向
orientation_bin = np.arctan2(gy, gx)
# 计算每个单元的HOG描述符
cell_size = pixel_per_cell
block_size = cell_per_block
hog_descriptors = []
for y in range(0, image.shape[0] - cell_size[1] + 1, cell_size[1]):
for x in range(0, image.shape[1] - cell_size[0] + 1, cell_size[0]):
# 计算每个单元中每个像素的梯度方向
block_orientations = []
for cy in range(cell_size[1]):
for cx in range(cell_size[0]):
index = (y + cy, x + cx)
orientation = orientation_bin[index]
if orientation < 0:
orientation += 2 * np.pi
block_orientations.append(orientation)
# 计算直方图
histogram = np.zeros((bin_n,))
for orientation in block_orientations:
histogram[int(orientation * (bin_n / (2 * np.pi)))] += 1
# 将直方图添加到HOG描述符中
hog_descriptors.append(histogram)
# 将块组合成大的特征向量
hog_descriptors = np.array(hog_descriptors).ravel()
return hog_descriptors
# 示例使用
image = cv2.imread('image.jpg')
hog_feature = hog_descriptor(image)
print(hog_feature)
这段代码首先将输入图像转换为灰度图像,然后计算每个像素的梯度和梯度方向。接着,它将图像分块,并为每个块计算梯度方向的直方图。最后,它将这些直方图组合成一个单一的特征向量,该向量可以用作目标识别或检测的特征。
3.HOG举例
以行人检测为例,我们可以简要说明HOG(Histogram of Oriented Gradients,方向梯度直方图)的应用。
假设我们有一个图像,其中包含一个行人,行人正走在一栋白色建筑前,穿着白色外套和黑色裤子。由于背景大多是白色,黑色裤子的对比度将非常高,但外套与背景颜色相近,对比度将非常低。在这种情况下,使用HOG算法可以帮助我们有效地检测出行人。
HOG算法的工作原理是创建图像中梯度方向分布的直方图,并以一种特殊的方式对其进行归一化。这种特殊的归一化使得HOG能够有效地检测物体的边缘,即使在对比度很低的情况下也是如此。
在行人检测中,HOG算法首先将图像划分为小的单元格,并在每个单元格内计算梯度方向的直方图。然后,将相邻的单元格组合成块,并对块内的直方图进行归一化。最后,将所有块的直方图连接起来,形成一个长向量,这个向量就是图像的HOG特征。
得到HOG特征后,我们可以使用机器学习算法(如支持向量机SVM)进行训练,以学习如何根据图像的HOG特征来检测行人。在测试阶段,我们可以对新的图像计算HOG特征,并将其输入到训练好的模型中进行预测,从而判断图像中是否包含行人。
总之,HOG算法通过计算图像局部区域的梯度方向直方图来构建特征,对光照和阴影的变化具有一定的鲁棒性,因此在行人检测等计算机视觉任务中得到了广泛应用。
4.HOG算法原理
HOG(Histogram of Oriented Gradients)算法原理主要是基于图像中物体的边缘方向局部统计。以下是HOG算法原理的详细解释:
-
主要思想:在一幅图像中,局部目标的表象和形状能够被梯度或边缘的方向密度分布很好地描述。其本质为梯度的统计信息,而梯度主要存在于边缘的地方。
-
实现方法:
- 图像预处理:首先,输入的图像会进行预处理,以减小光照、对比度等因素的影响,并将其转化为灰度图像。
- 图像划分:图像会被划分为小的连通区域,这些区域被称为“细胞单元”(cell)。
- 计算梯度:在每个细胞单元中,计算各个像素点的梯度和边缘方向。这通常涉及到计算像素点在水平方向和垂直方向的梯度,从而得到梯度的幅度和方向。
- 统计直方图:然后,统计每个细胞单元的方向梯度直方图。每个直方图实际上是一个包含多个bin的数组,每个bin代表一个特定的方向范围。像素点根据其梯度方向为相应的bin投票,投票的权重通常是该像素点的梯度幅度。
- 归一化:为了对光照和阴影有更好的不变性,需要对直方图进行对比度归一化。这通常是在更大的图像区域(称为“块”,block)中进行的。通过将局部直方图在更大的块范围内进行对比度归一化,可以提高算法的鲁棒性。
- 组合特征:最后,将所有块的归一化后的直方图组合起来,就构成了整幅图像的HOG特征描述子。
-
应用:HOG特征描述子与SVM(支持向量机)等分类器结合使用,已经被广泛应用于图像识别中,特别是在行人检测、面部识别、手势识别等任务中获得了极大的成功。
总的来说,HOG算法通过计算和统计图像局部区域的梯度方向直方图来构建特征描述子,这些特征描述子能够很好地表示图像中目标的形状和边缘信息,对于目标检测等任务非常有用。