如何在python中从3D图像中提取pache?

如何在python中从3D图像中提取pache?,python,numpy,image-processing,computer-vision,Python,Numpy,Image Processing,Computer Vision,我有一张3D图像,大小为:Deep x Weight x Height(例如:10x20x30,表示10张图像,每张图像的大小为20x30) 给定一个补丁大小为pd x pw x ph(例如pd使用np.lib.stride\u技巧。as\u stride。此解决方案不需要用步长来划分输入堆栈的相应维度。它甚至允许重叠补丁(在这种情况下,不要写入结果,也不要复制)。因此,它比其他方法更灵活: import numpy as np from numpy.lib import stride_tric

我有一张3D图像,大小为:
Deep x Weight x Height
(例如:
10x20x30
,表示10张图像,每张图像的大小为
20x30


给定一个补丁大小为
pd x pw x ph
(例如
pd使用
np.lib.stride\u技巧。as\u stride
。此解决方案不需要用步长来划分输入堆栈的相应维度。它甚至允许重叠补丁(在这种情况下,不要写入结果,也不要复制)。因此,它比其他方法更灵活:

import numpy as np
from numpy.lib import stride_tricks

def cutup(data, blck, strd):
    sh = np.array(data.shape)
    blck = np.asanyarray(blck)
    strd = np.asanyarray(strd)
    nbl = (sh - blck) // strd + 1
    strides = np.r_[data.strides * strd, data.strides]
    dims = np.r_[nbl, blck]
    data6 = stride_tricks.as_strided(data, strides=strides, shape=dims)
    return data6#.reshape(-1, *blck)

#demo
x = np.zeros((5, 6, 12), int)
y = cutup(x, (2, 2, 3), (3, 3, 5))

y[...] = 1
print(x[..., 0], '\n')
print(x[:, 0, :], '\n')
print(x[0, ...], '\n')
输出:

[[1 1 0 1 1 0]
 [1 1 0 1 1 0]
 [0 0 0 0 0 0]
 [1 1 0 1 1 0]
 [1 1 0 1 1 0]] 

[[1 1 1 0 0 1 1 1 0 0 0 0]
 [1 1 1 0 0 1 1 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 0 0 1 1 1 0 0 0 0]
 [1 1 1 0 0 1 1 1 0 0 0 0]] 

[[1 1 1 0 0 1 1 1 0 0 0 0]
 [1 1 1 0 0 1 1 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 0 0 1 1 1 0 0 0 0]
 [1 1 1 0 0 1 1 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0]] 
说明。Numpy数组按步长组织,每个维度一个,数据点[x,y,z]位于内存中的地址基+步长x*x+步长y*y+步长z*z

stride\u技巧。as\u stride
factory允许直接操纵与给定数组共享内存的新数组的步长和形状。只有在您知道自己在做什么时才可以尝试此操作,因为没有执行任何检查,这意味着您可以通过寻址越界内存来射击脚

代码使用此函数将三个现有标注拆分为两个新标注,一个用于对应的块内坐标(这将与原始标注具有相同的跨距,因为块中的相邻点对应于整个堆栈中的相邻点)以及沿该轴的块索引的一个维度;该维度将具有步幅=原始步幅x块步幅

代码所做的只是计算正确的步幅和尺寸(=沿三个轴的块尺寸和块计数)


由于数据与原始数组共享,当我们将6d数组的所有点设置为1时,它们也会设置在原始数组中,从而在演示中暴露块结构。请注意,函数最后一行中注释掉的
重塑
会断开此链接,因为它会强制复制。

略读
模块为您提供一个集成的解决方案。
消息来源是在线的


注意选择深度、重量、高度的倍数,因为当你大步前进时,不要检查边界。

谢谢你的解决方案。你能解释一下这个想法吗?@user3051460我已经试过了(见帖子);我还简化了一点代码。使用
as_strip
的全部目的是为了满足不划分输入维度的块维度。只有
重塑基于此限制的解决方案。mmmh。我不太确定op的目标。这似乎是一项(t,x,y)中的跟踪任务空格。在这种情况下,步幅不需要重新定义……我会问他。@B.M.这是一个很好的lib。但是如果两个补丁重叠,会发生什么情况。这意味着步幅小于重量/2或高度/2。也许
view\u as\u windows
在这种情况下可以帮助你?@B.M:你是对的。as\u stried不检查边界。我正在尝试
view\u as\u windows
。您认为
view_as_windows
支持随机选择补丁吗?您是否试图在(时间,x,y)空间中跟踪大图像中的某些细节?是否要为已知(x0,y0,t0)生成微空间([t0 dt,t0+dt],[x0 dx,x0+dx],[y0 dy,y0+dy])?事实上,我不在乎时间。我只想将图像提取到给定图像和补丁大小的补丁中。补丁将从左到右扫描,并进行深度扫描。该过程类似于卷积,但我提取的是补丁,而不是计算值