使用多个bin numpy histogram拆分值

时间:2017-05-02 17:07:51

标签: python numpy histogram

我正在尝试对此图片进行编程:

enter image description here

在图像上,右侧的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]

2 个答案:

答案 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()