通过对每个块的局部直方图进行归一化来实现对比度归一化。
这里详细解释了整个HOG提取过程:http://www.geocities.ws/talh_davidc/#cst_extract
当您对块直方图进行标准化时,如果直方图确实包含每个方向的幅度之和,则实际上会对此块中的对比度进行标准化。
术语"直方图"这里很混乱,因为你不计算有多少像素有方向k ,而是你总和这些像素的大小。因此,您可以在计算块的向量之后,甚至在计算整个向量之后对对比度进行标准化,假设您知道向量中的哪些索引开始一个块并且块结束。
由于我的理解,算法的步骤对我来说有95%的成功率:
-
定义以下参数(在此示例中,参数类似于人类检测纸张的HOG):
- 以像素为单位的像素大小(例如6x6)
- 单元格中的块大小(例如3x3 ==>表示以像素为单位的18x18)
- 块重叠率(例如50%==>意味着块宽度和块高度都必须是偶数。在这个例子中,它满足,因为单元宽度和单元高度是偶数(6像素),使块宽和高度也均匀)
- 检测窗口大小。尺寸必须可以通过块大小的一半来分割而没有余数(因此可以将块精确地放置在50%重叠内)。例如,块宽度是18个像素,因此窗口宽度必须是9的乘法(例如9,18,27,36 ......)。窗口高度相同。在我们的示例中,窗口宽度为63像素,窗口高度为126像素。
-
计算渐变:
- 使用卷积与向量[-1 0 1]
计算X差异
- 使用卷积与上述矢量的转置计算Y差值
- 使用 sqrt(diffX ^ 2 + diffY ^ 2)
计算每个像素的渐变幅度
- 使用 atan(diffY / diffX)计算每个像素的渐变方向。请注意, atan 将返回 -90 和 90 之间的值,而您可能希望 0 之间的值和的 180 即可。所以只需翻转所有负值,加上 +180 度。请注意,在HOG for Human Detection中,它们使用无符号方向(0到180之间)。如果您想使用已签名的路线,您应该多付出一些努力:如果diffX和diffY为正,您的 atan 值将介于 0 和 90 <之间/ strong> - 保持原样。如果diffX和diffY为负,那么您将获得相同范围的可能值 - 此处添加+180,因此方向将翻转到另一侧。如果diffX为正且diffY为负,您将获得 -90 和 0 之间的值 - 保持不变(如果需要,可以添加+360)正)。如果diffY为正且diffX为负,则您再次获得相同的范围,因此添加+180,将方向翻转到另一侧。
- &#34;滨&#34;方向。例如,9个无符号分箱: 0-20,20-40,...,160-180 。您可以通过将每个值除以20来轻松实现这一目标并对结果进行分层。您的新分箱路线将介于 0 和 8 之间。
-
使用原始矩阵的副本分别对每个块执行操作(因为某些块重叠,我们不想破坏它们的数据):
- 拆分为单元格
- 对于每个单元格,创建一个包含9个成员的向量(每个单元格一个)。对于bin中的每个索引,设置具有该方向的所有像素的所有大小的总和。我们在一个单元格中有6x6像素。因此,例如,如果2个像素的方向为0而第一个的幅度为0.231且第二个的幅度为0.13,则应在向量中的索引0中写入值0.361(= 0.231 + 0.13)。
- 将块中所有单元格的所有向量连接成一个大向量。此向量大小当然应 NUMBER_OF_BINS * NUMBER_OF_CELLS_IN_BLOCK 。在我们的示例中,它是 9 *(3 * 3)= 81 。
- 现在,规范化此向量。使用 k = sqrt(v [0] ^ 2 + v [1] ^ 2 + ... + v [n] ^ 2 + eps ^ 2)(我使用eps = 1)。计算 k 后,将矢量中的每个值除以 k - 这样你的矢量就会被标准化。
-
创建最终矢量:
- 将所有块的所有向量连接成1个大向量。在我的例子中,这个向量的大小是6318
醇>