假设我有一个形状为imgs
的ndarray ( num_images, 3, width, height )
,它存储了一堆大小相同的num_images
RGB图像。
我想从每个图像切片/裁剪一个形状( 3, pw, ph )
的补丁,但补丁的中心位置对于每个图像是不同的,并以centers
形状(num_images, 2)
数组给出。< / p>
是否有一种很好/ pythonic方式切片imgs
来获取patches
(形状为(num_images,3,pw,ph)
)每个补丁都围绕其对应的centers
?
为简单起见,可以安全地假设所有补丁都在图像边界内。
答案 0 :(得分:1)
正确切片是不可能的,因为您需要以不规则的间隔访问基础数据。你可以通过单一的花式索引获得庄稼&#34;操作,但你需要一个(非常)大的索引数组。因此,我认为使用循环更容易,更快。
比较以下两个功能:
def fancy_indexing(imgs, centers, pw, ph):
n = imgs.shape[0]
img_i, RGB, x, y = np.ogrid[:n, :3, :pw, :ph]
corners = centers - [pw//2, ph//2]
x_i = x + corners[:,0,None,None,None]
y_i = y + corners[:,1,None,None,None]
return imgs[img_i, RGB, x_i, y_i]
def just_a_loop(imgs, centers, pw, ph):
crops = np.empty(imgs.shape[:2]+(pw,ph), imgs.dtype)
for i, (x,y) in enumerate(centers):
crops[i] = imgs[i,:,x-pw//2:x+pw//2,y-ph//2:y+ph//2]
return crops