我正在尝试对此图片进行编程:
在图像上,右侧的2被映射到箱“80”,因为左侧的相应值是80.然而,右侧的4在左侧具有相应的值10 - 一边,因为10没有bin,4需要分成两个值。
为了实现这一点,我使用numpy的直方图和“weight”参数,如下所示:
t1 = [80, 10]
t2 = [2, 4]
bins = np.arange(0, 200, 20)
h = np.histogram(t1,bins=bins,weights=t2)
2被正确映射,但4被完全映射到bin 0(最左边)。
输出:
[4 0 0 0 2 0 0 0 0]
我认为是因为第一个箱子负责一个范围内的所有方向(0到20),而不是在方向不等于与箱子完全相同的数量时跳过大小。< / p>
所以,我想知道是否有人知道如何重写这个,所以输出将是:
[2 2 0 0 2 0 0 0 0]
答案 0 :(得分:4)
让我们先考虑一个更简单的任务: 假设您希望按如下方式量化梯度方向(GD):floor(GD / 20)。您可以使用以下内容:
h = np.bincount(np.floor(GD.reshape((-1)) / 20).astype(np.int64), GM.reshape((-1)).astype(np.float64), minlength=13)
其中np.bincount基于量化的梯度方向(GD)简单地累积梯度幅度(GM)。请注意,binlength控制直方图的长度,它等于ceil(255/20)。
但是,你想要软分配,所以你必须加权转基因贡献,你可能想尝试:
GD = GD.reshape((-1))
GM = GM.reshape((-1))
w = ((GD / 20) - np.floor(GD / 20)).astype(np.float64)
h1 = np.bincount(np.floor(GD / 20).astype(np.int64), GM.astype(np.float64) * (1.0-w), minlength=13)
h2 = np.bincount(np.ceil(GD / 20).astype(np.int64), GM.astype(np.float64) * w, minlength=13)
h = h1 + h2
p.s人们可能想要考虑np.bincount文档https://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html
答案 1 :(得分:1)
请参阅Roy Jevnisek的回答,因为9个垃圾箱,最小长度应为9。
此外,由于180度等于0度,因此h的最后一个元素应被忽略,并视为h的第一个元素,因为h的第一个和最后一个元素都表示0度的加权计数,即:
h[0] = h[-1]
h = h[:-1]
然后可以通过以下方式绘制HOG:
GD = GD.reshape(-1)
GM = GM.reshape(-1)
w1 = (GD / 20) - np.floor(GD / 20)
w2 = np.ceil(GD / 20) - (GD / 20)
h1 = np.bincount(np.floor(GD / 20).astype('int32'), GM * w2, minlength=9)
h2 = np.bincount(np.ceil(GD / 20).astype('int32'), GM * w1, minlength=9)
h = h1 + h2
h[0] = h[-1]
h = h[:-1]
values = np.unique(np.floor(GD / 20).astype(np.int64))[:-1]
plt.title('Histogram of Oriented Gradients (HOG)')
plt.bar(values, h)
plt.show()