一.HOG算法原理
-
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。HOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征。
-
1、主要思想:
在一副图像中,局部目标的表象和形状能够被梯度或边缘的方向密度分布很好地描述。其本质为:梯度的统计信息,而梯度主要存在于边缘的地方。
Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。 -
2、实现方法:
首先将图像分成小的连通区域,这些连通区域被叫做细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来,就可以构成特征描述符。 -
3、性能提高:
将这些局部直方图在图像的更大的范围内(叫做区间)进行对比度归一化,可以提高该算法的性能,所采用的方法是:先计算各直方图在这个区间中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。
二.HOG算法代码
"""
下面的程序中,cell大小为8*8。
因此128/8 = 16, 64/8 = 8
一个128*64的图片,最终划分成了 16*8个cell, 特征维度为 16*8*9
再计算归一化后的block的特征
"""
import cv2
import numpy as np
import math
import matplotlib.pyplot as plt
class Hog_descriptor():
"""
HOG描述符的实现
"""
def __init__(self, img, cell_size=8, bin_size=9):
"""
构造函数
默认参数,一个block由2x2个cell组成,步长为1个cell大小
args:
img:输入图像(更准确的说是检测窗口),这里要求为灰度图像 对于行人检测图像大小一般为128x64 即是输入图像上的一小块裁切区域
cell_size:细胞单元的大小 如8,表示8x8个像素
bin_size:直方图的bin个数
"""
self.img = img
'''
采用Gamma校正法对输入图像进行颜色空间的标准化(归一化),目的是调节图像的对比度,降低图像局部
的阴影和光照变化所造成的影响,同时可以抑制噪音。采用的gamma值为0.5。 f(I)=I^γ
'''
self.img = np.sqrt(img * 1.0 / float(np.max(img)))
self.img = self.img * 255
# print('img',self.img.dtype) #float64
# 参数初始化
self.cell_size = cell_size
self.bin_size = bin_size
self.angle_unit = 180 / self.bin_size # 这里采用180°
assert type(self.bin_size) == int, "bin_size should be integer,"
assert type(self.cell_size) == int, "cell_size should be integer,"
assert 180 % self.bin_size == 0, "bin_size should be divisible by 180"
def extract(self):
"""
计算图像的HOG描述符,以及HOG-image特征图
"""
height, width = self.img.shape
'''
1、计算图像每一个像素点的梯度幅值和角度
'''
# gradient_magnitude:shape为(128,64)
# 每个像素点的梯度值、梯度方向
gradient_magnitude, gradient_angle = self.global_gradient()
gradient_magnitude = abs(gradient_magnitude)
'''
2、计算输入图像的每个cell