NumPy/Pythorch提取图像子集

2024-04-27 03:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

在Numpy中,给定一个由size(N,hl,wl)组成的大图像A,以及大小为(N)的x和大小为(N)的y的坐标,我想得到大小为(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中也能工作吗?如果没有,我如何在那里实现这一点?在


Tags: in图像numpyforsizezerosrangepytorch
2条回答

在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()

其中切片中的第一个:表示选择批中的所有图像。第二个和第三个:表示高度和宽度的切片。在

使用^{} from ^{}非常简单,将那些滑动窗口视图作为一个6D数组,第四个轴是singleton。然后,使用^{}根据yx索引选择我们想要的索引,以便索引到窗口数组的第二和第三个轴,从而得到我们的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):

^{pr2}$

2)索引到第二和第三轴的y和x索引:

^{3}$

3)最后是期望的输出,它是沿着第一个轴的每个2D切片的一个块,其起点(左上角点)是该2D切片上的(y,x)。请参阅A中的星号以了解-

In [81]: B
Out[81]: 
array([[[ 2,  6],
        [ 3,  4]],

       [[ 9,  3],
        [10,  8]],

       [[ 4,  8],
        [ 2, 10]]])

相关问题 更多 >