如何从CT图像3D堆栈中提取100³规格的3D子体素?
提取CT 3D堆栈中100³子体素的方法
核心思路:直接用数组切片提取
不用meshgrid——它是用来生成坐标网格点的工具,适合绘图或采样点定位,而提取子体素直接用numpy的切片索引才是高效准确的方式。
1. 确定合法起始坐标范围
原数组维度为(1000,1000,500),要提取100×100×100的子体,每个维度的起始索引必须满足:
- 第0轴(行):
start_x∈ [0, 900](1000-100) - 第1轴(列):
start_y∈ [0, 900](1000-100) - 第2轴(层):
start_z∈ [0, 400](500-100)
2. 代码实现示例
假设CT数据已读入为numpy数组ct_array(shape=(1000,1000,500)):
随机提取单个100³子体
import numpy as np # 生成合法随机起始坐标 start_x = np.random.randint(0, 1000 - 100 + 1) start_y = np.random.randint(0, 1000 - 100 + 1) start_z = np.random.randint(0, 500 - 100 + 1) # 切片提取子体 sub_volume = ct_array[start_x:start_x+100, start_y:start_y+100, start_z:start_z+100] # 此时sub_volume的shape为(100,100,100)
规则滑动窗口提取(步长设为50为例)
step = 50 sub_volumes = [] # 遍历所有合法起始点 for x in range(0, 1000 - 100 + 1, step): for y in range(0, 1000 - 100 + 1, step): for z in range(0, 500 - 100 + 1, step): sub = ct_array[x:x+100, y:y+100, z:z+100] sub_volumes.append(sub) # sub_volumes为包含所有子体的列表,每个元素都是(100,100,100)的数组
3. 为什么meshgrid效果不佳?
meshgrid的作用是生成三维坐标点网格(如X,Y,Z = np.meshgrid(x,y,z)),得到的是每个体素的坐标值,而非直接提取子体积。用它来提取子体需要先生成坐标索引再索引数组,步骤冗余且效率低下,远不如直接切片高效。
4. 注意事项
- 确认数组维度顺序:若你的CT数据是
(层,行,列)而非(行,列,层),需调整切片的轴顺序。 - 检查数据类型:CT数据常用
uint16类型,提取前确认数组dtype,避免后续处理出错。 - 控制子体重叠:调整步长可实现重叠提取(如步长设为20,子体间会有80的重叠区域)。
内容的提问来源于stack exchange,提问作者Nilzon Aguirre Velasquez
相关产品推荐
相关产品推荐

