1.方向梯度直方图(Histogram of Oriented Gradient)
笔记参考:HOG特征提取
笔记参考:一文讲解方向梯度直方图(hog)
笔记参考:Histogram of Oriented Gradients (HOG) | By Dr. Ry @Stemplicity
笔记参考:C34 | HOG Feature Vector Calculation | Computer Vision | Object Detection | EvODN
笔记参考:Histograms of Oriented Gradients (HOG)
笔记参考:HOG算法中用到三线性插值(Trilinear Interpolation)的作用及其用法(包括HOG的matlab源代码分析)
步骤如下:
- 图片预处理
- 计算图像梯度
- 计算图像梯度直方图
- 对Block进行L2归一化
- 合并Block特征向量得到整个图像的特征向量
1.1 图片预处理
裁剪图片、去除光照等不良因素
1.2 计算图像梯度
将处理后的图像划分为小的Cell,几个Cells组成Block
下图为其中一个cell中的像素情况
计算整个图像中每个Cell的x方向梯度和y方向梯度,可以使用Sobel算子对图像进行卷积运算即可完成此步骤
使用sobelx得到y方向边缘(中间0与像素对应乘为0,也就是忽略中间竖线,只保留左右竖线)
使用sobely得到x方向边缘(中间0与像素对应乘为0,也就是忽略中间横线,只保留上下横线)
计算每个Cell的
x
x
x 方向梯度
G
x
G_x
Gx和
y
y
y 方向梯度
G
y
G_y
Gy后,计算梯度大小和方向(由X,Y方向合成)
G
=
G
x
2
+
G
y
2
θ
=
a
r
c
t
a
n
G
y
G
x
G=\sqrt{G_x^2+G_y^2}\\ ~\\ \theta=arctan\frac{G_y}{G_x}
G=Gx2+Gy2 θ=arctanGxGy
最终得到图像中所有cell的梯度大小和梯度方向,
1.3 计算图像梯度直方图
量化角度:将0-180°划分为9个部分(9 bins)
上图中为一个Cell的梯度大小和梯度方向图,接下来需要进行统计,将每个像素对应的梯度大小映射到对应方向的范围内。
问题:使用插值对梯度直方图进行修正?将某个像素点的梯度幅值以不同的权重累加到相应的bin上,
插值是为了防止产生区域混叠效应(什么是混叠效应?)
将同一个cell中的统计完成后得到一个cell的梯度直方图
按照以上方式将图像中的每个cell的梯度大小图和梯度方向图整合成一个个直方图
个人理解:一个cell的直方图可以写为向量形式 [第一个bin的数值大小,第二个bin的数值大小,……]
1.4 对Block进行L2 归一化
几个cells组成一个block
将一个block中的每个cell直方图的向量拼接起来组合成一个block的向量
因梯度对光照敏感(为什么?)所以需要将直方图归一化(使用L2范数)以此消除光照影响
将block向量使用L2范数归一化
v
e
c
=
[
a
,
b
,
c
]
∣
v
e
c
∣
=
a
2
+
b
2
+
c
2
归一化后的向量
=
[
a
∣
v
e
c
∣
,
b
∣
v
e
c
∣
,
c
∣
v
e
c
∣
]
vec=[a,b,c]\\ ~\\ |vec|=\sqrt{a^2+b^2+c^2}\\ ~\\ \text{归一化后的向量}=[\frac{a}{|vec|},\frac{b}{|vec|},\frac{c}{|vec|}]
vec=[a,b,c] ∣vec∣=a2+b2+c2 归一化后的向量=[∣vec∣a,∣vec∣b,∣vec∣c]
每个block都有一个特征向量,block在图像上滑动窗口,滑过整个图像
1.5 合并Block特征向量
将所有block的特征向量拼接在一起作为整幅图像的特征向量,图像特征向量作为支持向量机的输入,SVM进行分类
1.6 总结
图像->cell梯度->cell梯度直方图 ->cell特征向量 ->block特征向量->图像特征向量