Python 从4D阵列裁剪图像的不同部分以增强数据

Python 从4D阵列裁剪图像的不同部分以增强数据,python,numpy,image-processing,multidimensional-array,computer-vision,Python,Numpy,Image Processing,Multidimensional Array,Computer Vision,我有以下批量RGB图像阵列(4D阵列): 现在,我只想从左上角在所有3通道上裁剪某些维度,比如(12x12),最好沿着批次维度(即轴0)一次裁剪。我的想法是制作一个网格并将其切片。因此,我构建了这个网格: In [56]: grid = np.c_[np.arange(12)]+ np.r_[np.arange(12)] In [57]: grid.shape Out[57]: (12, 12) 但是,当我切片数组时,我得到了一些意想不到的结果: In [58]: img_arr[:, gr

我有以下批量RGB图像阵列(4D阵列):

现在,我只想从左上角在所有
3
通道上裁剪某些维度,比如(
12x12
),最好沿着批次维度(即
轴0
)一次裁剪。我的想法是制作一个网格并将其切片。因此,我构建了这个网格:

In [56]: grid = np.c_[np.arange(12)]+ np.r_[np.arange(12)]

In [57]: grid.shape
Out[57]: (12, 12)
但是,当我切片数组时,我得到了一些意想不到的结果:

In [58]: img_arr[:, grid, :].shape
Out[58]: (10000, 12, 12, 32, 3)
我期望并且需要的结果是形状
(10000,12,12,3)
,但我不知道
32
是从哪里来的

这只是一个例子。理想情况下,我想在图像viz上的10个不同位置进行裁剪。左上、右上、左下、右下等

但是,通过首先进行左上角裁剪,其余部分应该是直观的

此外,正如您所见,我需要在一个4D数组中沿批次维度存储超过100K的图像,因此在进行此类随机裁剪时,如果能看到视图就很好了,因为这样会节省内存。

我们可以使用它:我们可以为第二维度和第三维度指定一个范围,如:

sub_img = img_arr[:, :12, :12 , :]
作为视图的切片 注意,我们在这里构建一个视图,我们不复制数组,我们只构建一个视图。因此,如果我们在视图范围内的
img\u arr
中进行更改,我们将能够在
sub\u img
中看到,反之亦然。如果需要副本,可以通过
数组
构造函数传递视图:

sub_img = np.array(img_arr[:, :12, :12])  # making a copy, instead of a view
如果维数是任意的,我们可以先构造这样的元组。除第一个和最后一个维度外,将所有维度切片为12的元组是:

# generalized with arbitrary number of dimensions
indices = (slice(None), *(slice(12) for _ in range(img_arr.ndim - 2)))
sub_img = img_arr[indices]

很不错的!因此,我只需要使用切片索引对维度和在
img\u arr
中的位置进行硬编码。@kmario23:您不必硬编码,也可以使用标识符,如
a=12
,然后
sub\u img=img\u arr[:,:a,:a]
。你甚至不需要硬编码维度的数量,你可以通过切片传递一个元组。你打算如何从数学上引入这10个位置?可能是每个补丁的开始(左上角pt)的
(x,y)
。@Divakar,每个原始图像裁剪部分位于:
左上角、右上角、左下角、右下角、中间裁剪
;然后,水平翻转图像并再次在以下位置进行裁剪:
左上角、右上角、左下角、右下角和中心裁剪
。数据扩充:)是的,然后按照贴出的答案中的建议进行切片。对于水平翻转,使用
a[:,:-1]
并使用相同的切片,即
a[:,:-1][:,:12,:12,:]
等等。对于垂直翻转:
a[:,:,::-1]
@Divakar哦,太酷了!因此,我们只需拥有原始阵列的一个副本就可以实现所有功能。是否将其添加为答案?是否添加一些来源(文档)并将其添加为答案:)
sub_img = np.array(img_arr[:, :12, :12])  # making a copy, instead of a view
# equivalent to the first code fragment
indices = (slice(None), slice(12), slice(12))
sub_img = img_arr[indices]
# generalized with arbitrary number of dimensions
indices = (slice(None), *(slice(12) for _ in range(img_arr.ndim - 2)))
sub_img = img_arr[indices]