opencv - 定向梯度直方图中的最终向量

标签 opencv histogram gradient

图像的尺寸为 64 x 128。即 8192 个幅度和梯度值。在分箱阶段之后,我们剩下 1152 个值,因为我们根据它们的方向将 64 个像素转换为 9 个分箱。你能给我解释一下 L2 归一化后我们如何得到 3780 个向量吗?

最佳答案

假设:您有 64 x 128 色 block 的渐变。

计算 8x8 单元格中的梯度直方图

这是它开始变得有趣的地方。图像被分成 8x8 个单元格,并为每个 8x8 单元格计算一个 HOG。我们使用 8x8 单元格的原因之一是它提供了紧凑的表示。一个 8x8 图像 block 包含 8x8x3 = 192 个像素值(彩色图像)。该补丁的渐变每个像素包含 2 个值(幅度和方向),总计 8x8x2 = 128 个值。这 128 个数字使用 9-bin 直方图表示,该直方图可以存储为 9 个数字的数组。这使得它更加紧凑,并且在一个补丁上计算直方图使得这种表示对噪声更加鲁棒。

直方图本质上是一个由 9 个 bin 组成的向量,对应于 0、20、40、60 ... 180 度角,对应于无符号梯度。

16 x 16 block 归一化

根据图像的梯度创建直方图后,我们希望我们的描述符独立于光照变化。因此,我们对直方图进行归一化。 RGB 颜色 [128, 64, 32] 的矢量范数是 sqrt(128*128 + 64*64 + 32*32) = 146.64,这是臭名昭著的 L2-norm。将该向量的每个元素除以 146.64 得到一个归一化向量 [0.87, 0.43, 0.22]。如果我们将该向量的每个元素乘以 2,则归一化向量将与之前相同。

虽然简单地标准化 9x1 直方图很有趣,但标准化更大的 16 x 16 block 更好。一个 16 x 16 的 block 有 4 个直方图,它们可以连接起来形成一个 36 x 1 的元素向量,并且可以像示例中的 3 x 1 向量一样对其进行归一化。然后将窗口移动 8 个像素,并在该窗口上计算一个标准化的 36 x 1 向量并重复该过程(参见动画:Courtesy)

Windowing

计算HOG特征向量

这就是您的问题所在。

为了计算整个图像 block 的最终特征向量,将 36 x 1 向量连接成一个巨大的向量。让我们计算一下大小:

  1. 16 x 16 block 有多少个位置?有 7 个水平位置和 15 个垂直位置,共 105 个位置。

  2. 每个 16 x 16 block 由一个 36 x 1 向量表示。因此,当我们将它们全部连接成一个巨大的向量时,我们会得到一个 36 x 105 = 3780 维向量

更多详情,请查看the tutorial where I learned.

希望对您有所帮助!

关于opencv - 定向梯度直方图中的最终向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50504110/

相关文章:

user-interface - 以交互方式更改直方图箱的相对高度

r - Likert 包 - include.histogram + ggsave 的问题

matlab - 在 MATLAB 中使用 imgradient 时如何解释梯度的方向?

css - Safari 中错误的 CSS3 渐变渲染

java - 暴力匹配是否适用于 FREAK 描述符?

c++ - Opencv Flannbasedmatcher

histogram - 使用wireshark或其他工具绘制RTT直方图

html - 渐变不适用于 IE,但适用于其他任何地方

python - 我应该选择哪个版本的 python opencv?

c++ - solvePnpRansac GPU断言失败