Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NumPy/PyTorch提取图像子集_Python_Numpy_Deep Learning_Pytorch - Fatal编程技术网

Python NumPy/PyTorch提取图像子集

Python NumPy/PyTorch提取图像子集,python,numpy,deep-learning,pytorch,Python,Numpy,Deep Learning,Pytorch,在Numpy中,给定一堆大小为(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?如果没有,我如何在那里实现这一点?非常简单,可以将

在Numpy中,给定一堆大小为(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
?如果没有,我如何在那里实现这一点?

非常简单,可以将这些滑动窗口视图作为6D阵列,第四个轴是单体。然后,根据
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):

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]]])

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

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

这是与PyTorch中的
tf.image.extract\u-scape类似的提取片段的实现。应满足您的需求:

发布的解决方案中有哪一个对您有效?是的,它们都很好,但您的解决方案假设我要寻找的每个样本都有不同的切片。。但如果不在样本上循环,则很难移动到火炬。tensorflow有一个extract_Gliepses函数,目前还可以使用:)谢谢。但是,当你想为每幅图像扫描出不同的重影区域时,你在看torchvision.transforms.RandomCrop吗
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()