代码之家  ›  专栏  ›  技术社区  ›  isaacsultan

在4D阵列上以窗口的形式查看

  •  0
  • isaacsultan  · 技术社区  · 7 年前

    给定一个形状的ndarray(批量大小,w,h,c)和一个补丁大小(p,p),我想从每个3D矩阵(即形状,p,c)中提取补丁。没有补丁会重叠,所以步幅可以被认为是P。

    这将返回一个数组,其中包含(批处理大小*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 回复  |  直到 7 年前
        1
  •  0
  •   Juan    7 年前

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

    推荐文章