首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumPy/PyTorch提取图像子集

NumPy/PyTorch提取图像子集
EN

Stack Overflow用户
提问于 2017-09-27 14:06:56
回答 3查看 1.3K关注 0票数 1

在Numpy中,给出了A of size(N,hl,wl)的一堆大图像,以及大小(N)和y(N)的坐标x,我想得到更小的大小图像(N,16,16)。

在for循环中,它应该如下所示:

代码语言:javascript
复制
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中也能用吗?如果不是,我如何在那里实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-27 14:35:28

对于scikit-image来说,非常简单,可以将那些滑动窗口视图作为一个6D数组,第四个轴是单轴。然后,使用advanced-indexingyx索引中选择我们想要的索引,以便索引到窗口数组的第二和第三轴,以获得我们的B

因此,实施将是-

代码语言:javascript
复制
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):

代码语言:javascript
复制
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指数,以索引到第二轴和第三轴:

代码语言:javascript
复制
In [79]: y
Out[79]: array([1, 2, 0])

In [80]: x
Out[80]: array([1, 1, 0])

3)最后是所需的输出,即沿着第一轴从每个2D切片中各有一个块,其起始点(左上角点)是该2D片上的(y,x)。请参考A中的星号-

代码语言:javascript
复制
In [81]: B
Out[81]: 
array([[[ 2,  6],
        [ 3,  4]],

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

       [[ 4,  8],
        [ 2, 10]]])
票数 1
EN

Stack Overflow用户

发布于 2017-09-27 14:40:40

在numpy中,切片非常简单,同样的逻辑也适用于pytorch示例。例如

代码语言:javascript
复制
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()

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

票数 2
EN

Stack Overflow用户

发布于 2021-04-08 03:05:39

这是extract_glimpse的一个实现,类似于PyTorch中的tf.image.extract_glimpse。它应该满足您的需要:glimpse.py#L14

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46450040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档