给出形状(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
来解决问题,所以我愿意接受任何有效的建议。
答案 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]]]
不幸的是,重塑会触发复制。我不确定是否有避免的方法,但是希望这不是您主要的计算/内存问题。