我有一个点云数据,大致像这样:
图中红色点表示原始点云,黑色点表示将红色点云在xy平面上的投影。尽管在该图中不可见,但每个点还有一个值,当将其移动到xy平面上时,该值被添加到给定像素上。这些点由numpy(np
)数组表示,如下所示:
points=np.array([[x0,y0,z0,v0],[x1,y1,z1,v1],...[xn,yn,zn,vn]])
将这些要点转化成图像的最直观方法是通过简单的循环,如下所示:
image=np.zeros(img_size)
for point in points:
#each point = [x,y,z,v]
image[tuple(point[0:2])] += point[3]
目前这个代码可以运行,但是速度比较慢。因此,我想知道是否有一些利用向量化、切片和其他聪明的Numpy/Python技巧来加速它的方法,因为实际上我需要对大量点云进行这样的操作。我已经考虑过使用np.put
的方法:
def points_to_image(xs, ys, vs, img_size):
img = np.zeros(img_size)
coords = np.stack((ys, xs))
#put the 2D coordinates into linear array coordinates
abs_coords = np.ravel_multi_index(coords, img_size)
np.put(img, abs_coords, ps)
return img
在这种情况下,点被预先分成包含x、y和v分量的向量。虽然这很好用,但它当然只将最后一个点放在给定像素上,即它不是累加的。
非常感谢您的帮助!
np.bincount
。将其与您的展平坐标作为第一个参数,权重作为第二个参数,图像大小作为第三个参数一起使用。 - Paul Panzer