0 M+ j2 ?& T) r& n/ [7 ?' w二、如何计算HOG特征向量6 r |: J7 Y2 n: u2 h! g
6 F+ M$ g" y1 J, L: |9 L
Step1:图片预处理) g. M& z- p, _$ i$ |- e$ T3 R0 j+ Z
6 w* s! e T7 k9 B$ d- [9 l3 a' P我们需要对图像进行预处理,并将宽高比降低到1:2,图像大小最好是64 x 128。这是因为我们将图像分成8 x 8和16 x 16小块来提取特征。具有指定的大小(64 x 128)将使我们的所有计算相当简单。事实上,这正是原始论文中使用的值。当然完整的图片可以是任意的尺寸。通常我们会在图片的不同位置分析多尺度图片块。唯一的要求就是图片块需要有固定的长宽比。比如:100×200, 128×256或者1000×2000都可以,但101×205就不满足要求) D1 f! H2 k. s Z
5 q, m4 e( ~& I3 u" T! U3 N9 t我们对其求反函数就可以得到该像素点的梯度方向角度。 3 G0 C2 s9 U2 V8 u/ _6 ] T % D" B" m7 ^. tStep3:将图像划分为一个一个cell,并绘制cell的梯度直方图 ( f" x$ a: R1 x 6 n+ h0 l" i3 _" g. N8 b9 pHOG特征描述子中创建的直方图不是为整个图像生成,而是将图像分割为8 × 8个单元格(cell),计算每个单元格的方向梯度直方图。通过这样做,我们得到了代表整个图像的小块的特征(或直方图)。我们当然可以把这个值从8 x 8换成16 x 16或者32 x 32。% P& y5 ~$ A3 c* o9 Z& |% G: l
+ g3 [! E: f" f! U! u! P
如果我们将图像划分为8 × 8个单元格并生成直方图,假设我们将直方图的角度分为9份,也就是说有9个bin,则每个单元格获得9 x 1矩阵。下面介绍如何划分bin的角度以及如何将计算好的梯度幅值加到每一个bin中。' M! \/ Q0 U: q$ d' f7 v: Q
0 S; p. C( j5 @) G8 G5 d% R, G我们采用9个bin的直方图来统计这8 x 8个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如下图所示,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9个bin)。 2 t N; z% z+ e& @! |0 ^1 @7 r ( C1 c g8 z, W
. T/ b( W2 F( x现在我们知道如何标准化一个向量,你可能想到当计算HOG特征的时候你可以像之前标准化一个3×1向量一样去标准化9×1的直方图。这的确是个不错的想法,但是更好的做法是标准化一个更大的16×16的block。一个16×16的block包含4个直方图(每一个bin的大小为8 x 8),这4个直方图可以连接成一个36×1的向量,而且这个向量仍然可以像那个3×1的向量一样进行标准化。每次标准化后,整个窗口移动8(假设)个像素并再次计算得到一个36×1的标准化向量,就这样一直重复这个过程。8 e, f% y; @. W/ A
1 H- u. \, }7 A) v2 F5 ZStep5:将所有block块的特征组合起来,形成HOG完整的特征描述向量 # r, \$ s- D* u6 M3 u( J$ Z0 H " _# f. Y3 R* B" {最后一步就是将检测窗口中所有的block块进行HOG特征的收集,并将它们结合成最终的特征向量供分类使用。 4 S# ~( o# y3 f! \8 T 5 Z( `# f! R- h7 ~( y3 _那么这个大向量的维度是多少?我们来计算: , X( X' ~7 F, _( P5 T" O3 w3 w c8 m6 r; }- `2 N# `4 O% @% Z; h对于64 x 128的图像而言,每8 x 8的像素组成一个cell,每2 x 2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长。 ]/ r' q# l% E4 F9 h/ \ ; X! R1 h. c/ S* j% O我们有多少个不同位置的16×16的block?一共有 (64-8)/8=7 个水平的位置和 (128-8)/8=15 个竖直的位置,所以总计7×15=105个。 # h5 ^/ j& _4 b3 F% b- k3 `2 D每一个16×16的block被表示成一个36×1的向量。因此,当我们把他们连接成一个大向量的时候会得到一个36×105=3780维度的向量。 ( k$ v3 c/ x4 B梯度直方图可视化 " m5 h: P+ z8 \ y* f5 I4 R% g / H; b; k9 h. c- F一个图像块梯度特征的可视化通常通过在所有8×8的cell里画出对应的标准化的9×1向量(直方图)。不幸的是,目前在OpenCV中并没有一个简单的API方法来可视化HOG特征。9 u2 \ C" a; F- n a6 w1 n
: _; y6 Q7 X% h0 Z/ ^# E& R. @三、使用OpenCV给出的API实现HOG9 g l2 d3 T1 h" A1 N# v3 b j+ C
1 u% s" j# X: G' C4 c* d. ?
这里我将在OpenCV栏目下介绍OpenCV中HOGDescriptor Struct Reference中的一些方法,如果需要请移步链接:https://blog.csdn.net/qq_40913465/article/details/1060701516 R7 }3 |0 i4 U. e" j
6 e1 F2 [( X' X9 t$ [; z4 g3 }' H
最后感谢以下两片博客给出的参考: 5 m9 _8 p: C8 Ohttps://baijiahao.baidu.com/s?id=1646997581304332534&wfr=spider&for=pc9 d- e3 H; @9 k- x1 f) e
https://blog.csdn.net/sinat_34474705/article/details/80219617 $ K) l' Q0 q% ?7 O- a ' F+ p6 S! b# j% _- |% {9 ~% t) P
———————————————— ) {$ K% Y# l! S- S9 P+ S- _8 [版权声明:本文为CSDN博主「一只工程狮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ U4 ~/ \! G" H& Z" x7 z! n" J2 F
原文链接:https://blog.csdn.net/qq_40913465/article/details/106065027' l4 j5 O4 B+ |, H8 c, E
+ \1 s: ]4 F# v) E