/ Q$ w2 D# L0 {1 ]4 b
我们对其求反函数就可以得到该像素点的梯度方向角度。 6 q F. S. W- g" J; W/ o3 i; K) G7 T 9 J2 m7 T7 c+ W- BStep3:将图像划分为一个一个cell,并绘制cell的梯度直方图 3 i& d: W8 }5 W3 s, c+ \ 4 t5 G* x7 @0 O) LHOG特征描述子中创建的直方图不是为整个图像生成,而是将图像分割为8 × 8个单元格(cell),计算每个单元格的方向梯度直方图。通过这样做,我们得到了代表整个图像的小块的特征(或直方图)。我们当然可以把这个值从8 x 8换成16 x 16或者32 x 32。 : c2 K) r8 H7 D7 M: L' T ( {$ b6 o% _ V( Y) y如果我们将图像划分为8 × 8个单元格并生成直方图,假设我们将直方图的角度分为9份,也就是说有9个bin,则每个单元格获得9 x 1矩阵。下面介绍如何划分bin的角度以及如何将计算好的梯度幅值加到每一个bin中。' ?& V) e4 ?/ o- Q8 O
( C- p! s6 X \2 R" j我们采用9个bin的直方图来统计这8 x 8个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如下图所示,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9个bin)。 ; L9 O0 ^* a; m. G: Q 9 g# S' m; i; m! x3 }9 n
2 \- Z4 f. ]5 t
在我讲梯度直方图如何标准化之前,我们先来看看一个长度为3的向量如何标准化。2 k" o i4 p: v# S) Q3 _3 X9 Q1 ]
" i% C; Z: X+ l. t
假设我们有一个RGB颜色向量[128, 64, 32]。这个向量的长度是1282+642+322−−−−−−−−−−−−−√ \sqrt{128^2 + 64^2 + 32^2} ! X0 T/ s* _. Q, I l) `5 ]" C1 ^128 0 f+ t% m$ ^& H8 e2 N& s% b2' H |9 ^; q! w" P. y& v' w7 K! K
+64 & c% m2 x$ |% Z/ ?2 u* f d4 c2 ( `3 }( a8 s9 B" t. h# F8 { +32 . z7 \' n8 }+ C1 b4 d' J2 ! D2 a1 ]1 H/ ~5 {0 J0 T6 g! c& o3 z2 U( R1 K2 g+ E
" _& X4 H4 `# i. y$ M9 ]5 i! R
=146.64。这也叫做向量的L2范数。将这个向量的所有元素除以向量长度146.64就可以得到一个标准化的向量[0.87, 0.43, 0.22]。3 q% j. e9 C* t1 b5 F3 \4 C* n
- Q# R# ~3 Y2 V8 i& l( e1 s
现在我们知道如何标准化一个向量,你可能想到当计算HOG特征的时候你可以像之前标准化一个3×1向量一样去标准化9×1的直方图。这的确是个不错的想法,但是更好的做法是标准化一个更大的16×16的block。一个16×16的block包含4个直方图(每一个bin的大小为8 x 8),这4个直方图可以连接成一个36×1的向量,而且这个向量仍然可以像那个3×1的向量一样进行标准化。每次标准化后,整个窗口移动8(假设)个像素并再次计算得到一个36×1的标准化向量,就这样一直重复这个过程。 V0 {4 n+ d5 W) m 6 d7 ]9 ]+ c h9 b9 B4 NStep5:将所有block块的特征组合起来,形成HOG完整的特征描述向量 * ?5 @; N L/ i) B: i1 Z9 K) f" M$ Z8 n
最后一步就是将检测窗口中所有的block块进行HOG特征的收集,并将它们结合成最终的特征向量供分类使用。" I2 F; o7 M+ \. Z' i" S8 c
) ?5 S# r) s7 C那么这个大向量的维度是多少?我们来计算:4 G ?: J+ q" n
. k8 B* X/ _, V/ d+ S {# R
对于64 x 128的图像而言,每8 x 8的像素组成一个cell,每2 x 2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长。 s4 s) @# V6 [* \) ?1 u
3 O4 l D2 e* Y9 ~: @我们有多少个不同位置的16×16的block?一共有 (64-8)/8=7 个水平的位置和 (128-8)/8=15 个竖直的位置,所以总计7×15=105个。 / @! T- W4 w y" k; p/ u$ J每一个16×16的block被表示成一个36×1的向量。因此,当我们把他们连接成一个大向量的时候会得到一个36×105=3780维度的向量。* \3 X) E- ?3 z! i: |7 w# m" S5 Z: v
梯度直方图可视化" C! I1 Z2 |. E- {: q
, U! m5 D0 T; H
一个图像块梯度特征的可视化通常通过在所有8×8的cell里画出对应的标准化的9×1向量(直方图)。不幸的是,目前在OpenCV中并没有一个简单的API方法来可视化HOG特征。 : Z# `" }" h% L 6 G$ L4 G$ r# p三、使用OpenCV给出的API实现HOG ! j+ C- ~ o- S" ]6 w; }& X. t/ t
这里我将在OpenCV栏目下介绍OpenCV中HOGDescriptor Struct Reference中的一些方法,如果需要请移步链接:https://blog.csdn.net/qq_40913465/article/details/106070151 2 g0 m, k& L' w; J' f: ~4 X0 f6 \5 |$ V9 R% R
最后感谢以下两片博客给出的参考:# r$ j' T; m8 B
https://baijiahao.baidu.com/s?id=1646997581304332534&wfr=spider&for=pc 3 V$ G* ~- S, Yhttps://blog.csdn.net/sinat_34474705/article/details/80219617! k( P: Y& C9 d* n: R0 Y: G
8 X4 S( E4 G) Q8 }& z V& I( p
1 \9 X4 b0 H& `" b————————————————' h+ I2 Q' K; A8 h7 d
版权声明:本文为CSDN博主「一只工程狮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 s( Y: s) z3 [+ l) G3 n. j/ @( c
原文链接:https://blog.csdn.net/qq_40913465/article/details/106065027% y3 P% g: \9 j, F6 Z) h# s