用Python从三维图像中提取面片

用Python从三维图像中提取面片,python,scikit-image,Python,Scikit Image,我试图从3D图像中提取补丁,作为神经网络的训练数据。但是我很难为更大的图像重塑补丁。我目前正在使用view_作为_窗口,但如果其他方法证明更有用,我愿意使用它们 我的代码的示例如下: 将numpy导入为np 从skimage.util导入视图作为窗口 内核大小=17 V=np.rand.rand(150150) X=视为视窗(V,(内核大小,内核大小,内核大小),步长=1) 这将创建一个大小为(134134,17,17,17)的numpy数组。现在,我理想地希望将其重塑为(2406104491

我试图从3D图像中提取补丁,作为神经网络的训练数据。但是我很难为更大的图像重塑补丁。我目前正在使用view_作为_窗口,但如果其他方法证明更有用,我愿意使用它们

我的代码的示例如下:

将numpy导入为np
从skimage.util导入视图作为窗口
内核大小=17
V=np.rand.rand(150150)
X=视为视窗(V,(内核大小,内核大小,内核大小),步长=1)
这将创建一个大小为
(134134,17,17,17)
的numpy数组。现在,我理想地希望将其重塑为
(24061044913)
,但尝试重塑会导致分配错误:

X=X.重塑(134**3,17**3)
MemoryError:无法为具有形状(134、134、134、17、17、17)和数据类型float64的数组分配88.1 GiB

是否有一种方法可以重塑我的补丁,或者有更好的通用方法来实现这一点?

问题是,如果不复制数据,就无法创建重塑后的阵列,因此您需要大量空间。简单的选择是对数据进行分块或批处理。大致(忽略边缘和重叠效果):


较长的答案是,您所做的(迭代所有17x17x17补丁)在字段中有一个名称,称为卷积,而卷积神经网络为您做到这一点,而无需创建昂贵的数据副本。简而言之,以这种方式使用
view\u as\u windows
是一个巧妙的小技巧,理解它与卷积的等价性是有用的,但它不是这项工作的正确工具。为此,深度学习lib库中应该使用3D卷积层。< / P>是的,我尝试补丁解决方案而不是美国有线电视新闻网的原因是我在2D中有困难使我的回归目的。但我会再试试3D。
xsize, ysize, zsize = V.shape
xbatch, ybatch, zbatch = (34, 34, 34)
batch_size = xbatch * ybatch * zbatch
for i, j, k in itertools.product(
    range(xsize // xbatch), range(ysize // ybatch), range(zsize // sbatch)
):
    Xbatch = X[i * xbatch : (i+1) * xbatch,
               j * ybatch : (j+1) * ybatch,
               k * zbatch : (k+1) * zbatch]
    Xbatch_linear = Xbatch.reshape((batch_size, -1))
    # ... do your deep learning on the batch