在Numpy中,给出了A of size(N,hl,wl)的一堆大图像,以及大小(N)和y(N)的坐标x,我想得到更小的大小图像(N,16,16)。
在for循环中,它应该如下所示:
B=numpy.zeros((N,16,16))
for i in range(0,N):
B[i,:,:]=A[i,y[i]:y[i]+16,x[i]:x[i]+16]但是我能用索引来做这个吗?额外的问题:这个索引在pytorch中也能用吗?如果不是,我如何在那里实现这一点?
发布于 2017-09-27 14:35:28
对于scikit-image来说,非常简单,可以将那些滑动窗口视图作为一个6D数组,第四个轴是单轴。然后,使用advanced-indexing从y和x索引中选择我们想要的索引,以便索引到窗口数组的第二和第三轴,以获得我们的B。
因此,实施将是-
from skimage.util.shape import view_as_windows
BSZ = 16, 16 # Blocksize
A6D = view_as_windows(A,(1,BSZ[0],BSZ[1]))
B_out = A6D[np.arange(N),y,x,0]解释
为了向其他读者解释问题的真正原因,下面是一个在一个较小的数据集上运行的示例,并使用一个(2,2)块-
1)输入阵列(3D):
In [78]: A
Out[78]:
array([[[ 5, 5, 3, 5, 3, 8],
[ 5, *2, 6, 2, 2, 4],
[ 4, 3, 4, 9, 3, 8],
[ 6, 3, 3, 10, 4, 5],
[10, 2, 5, 7, 6, 7],
[ 5, 4, 2, 5, 2, 10]],
[[ 4, 9, 8, 4, 9, 8],
[ 7, 10, 8, 2, 10, 9],
[10, *9, 3, 2, 4, 7],
[ 5, 10, 8, 3, 5, 4],
[ 6, 8, 2, 4, 10, 4],
[ 2, 8, 6, 2, 7, 5]],
[[ *4, 8, 7, 2, 9, 9],
[ 2, 10, 2, 3, 8, 8],
[10, 7, 5, 8, 2, 10],
[ 7, 4, 10, 9, 6, 9],
[ 3, 4, 9, 9, 10, 3],
[ 6, 4, 10, 2, 6, 3]]])2) y和x指数,以索引到第二轴和第三轴:
In [79]: y
Out[79]: array([1, 2, 0])
In [80]: x
Out[80]: array([1, 1, 0])3)最后是所需的输出,即沿着第一轴从每个2D切片中各有一个块,其起始点(左上角点)是该2D片上的(y,x)。请参考A中的星号-
In [81]: B
Out[81]:
array([[[ 2, 6],
[ 3, 4]],
[[ 9, 3],
[10, 8]],
[[ 4, 8],
[ 2, 10]]])发布于 2017-09-27 14:40:40
在numpy中,切片非常简单,同样的逻辑也适用于pytorch示例。例如
imgs = np.random.normal(size=(16,24,24))
imgs[:,0:12,0:12].shape
imgs_tensor = torch.from_numpy(imgs)
imgs_tensor[:,0:12,0:12].size()其中切片中的第一个:指示要选择批处理中的所有图像。第二和第三:表示切片的高度和宽度。
发布于 2021-04-08 03:05:39
这是extract_glimpse的一个实现,类似于PyTorch中的tf.image.extract_glimpse。它应该满足您的需要:glimpse.py#L14
https://stackoverflow.com/questions/46450040
复制相似问题