在4D阵列上的view_as_windows

时间:2018-07-03 19:52:57

标签: python numpy scikit-image

给出形状(batch_size,w,h,c)和补丁大小(p,p)的ndarray,我想从每个3D矩阵(即形状(p,p,c))中提取补丁。将重叠,因此步幅可被视为p。

这应该返回一个具有(batch_size * p * p,p,p,c)的数组

在这里使用skimage.view_as_windows是一个最小的示例

import numpy as np
import skimage

a = np.arange(8*8*2).reshape((8, 8, 2))
b = a * 2
c = np.concatenate((a[np.newaxis, :, :, :], b[np.newaxis, :, :, :]), axis = 0)
d = skimage.util.view_as_windows(c, 2, step  = 2).reshape((8*2*2, 2, 2, 2))

但是,只有备用值是我期望的值:

d[0]
Out[183]: 
array([[[ 0,  1],
        [ 2,  3]],
       [[16, 17],
        [18, 19]]])
d[1]
Out[184]: 
array([[[ 0,  2],
        [ 4,  6]],
       [[32, 34],
        [36, 38]]])
d[2]
Out[185]: 
array([[[ 4,  5],
        [ 6,  7]],
       [[20, 21],
        [22, 23]]])
d[3]
Out[186]: 
array([[[ 8, 10],
        [12, 14]],
       [[40, 42],
        [44, 46]]])
d[4]
Out[187]: 
array([[[ 8,  9],
        [10, 11]],
       [[24, 25],
        [26, 27]]])

因此,d[::2]接近我的解决方案,但一半的值都丢失了

我不确定问题是出在窗口大小还是步长上,还是不确定是否可以使用view_as_windows来解决问题,所以我愿意接受任何有效的建议。

1 个答案:

答案 0 :(得分:0)

首先,我认为您是要返回一定体积的(batch_size * w/p * h/p, p, p, c)吗?即,如果补丁不重叠,则补丁前后的尺寸乘积应相同。

已经解决了这个问题,这是我的尝试。我正在更改批次大小和通道尺寸,以更清楚地确定是哪个。

import numpy as np
from skimage import util
batch = np.arange(4*8*8*3).reshape((4, 8, 8, 3))
blocked = util.view_as_blocks((1, 2, 2, 3))
patches = blocked.reshape((64, 2, 2, 3))
print(patches[0].transpose((2, 0, 1)))
print(patches[1].transpose((2, 0, 1)))

给出:

[[[0 1]
  [8 9]]

 [[0 1]
  [8 9]]

 [[0 1]
  [8 9]]]

[[[ 2  3]
  [10 11]]

 [[ 2  3]
  [10 11]]

 [[ 2  3]
  [10 11]]]

不幸的是,重塑会触发复制。我不确定是否有避免的方法,但是希望这不是您主要的计算/内存问题。