如何将NII格式3D影像批量转换为2D PNG格式切片供2D模型使用
NII格式3D影像转2D PNG批量输出方案
前置依赖
需要提前安装以下工具库:
- nibabel:用于读取NII格式影像
- numpy:用于数组数值处理
- Pillow:用于PNG图像存储
安装命令:
pip install nibabel numpy pillow
批量转PNG实现代码
你已读取的scan数组维度为(128, 128, 100),第三个维度对应100张切片,可直接按以下代码循环输出PNG:
import nibabel as nib import numpy as np from PIL import Image import os # 定义输出文件夹,提前创建 output_dir = "./nii_slices_output" os.makedirs(output_dir, exist_ok=True) # 读取NII文件(你已有的代码) scan = nib.load('/path/to/stackOfimages.nii.gz') scan = scan.get_fdata() # 确认维度为(128, 128, 100) print(scan.shape) # 遍历所有切片输出PNG slice_count = scan.shape[2] for i in range(slice_count): # 取出单张切片 single_slice = scan[:, :, i] # 数值归一化到0-255区间,适配PNG存储要求 # 若原始像素已在0-255范围,可跳过以下两行归一化代码 single_slice = (single_slice - single_slice.min()) / (single_slice.max() - single_slice.min()) * 255 single_slice = single_slice.astype(np.uint8) # 生成图片,命名按三位序号排序,方便后续批量读取 img = Image.fromarray(single_slice) img.save(os.path.join(output_dir, f"slice_{i:03d}.png"))
输出的PNG会按slice_000.png到slice_099.png的命名规则存储,后续批量读取时可直接按文件名排序加载,符合你批量输入2D模型的要求。
无需存盘直接生成模型输入张量
如果不需要本地存储PNG文件,可直接将读取到的NII数组调整为模型要求的批量输入格式,示例如下(适配常见的[批量数, 高, 宽, 通道数]输入格式):
# 调整维度为(100, 128, 128),即[切片数, 高, 宽] batch_input = scan.transpose(2, 0, 1) # 新增单通道维度,适配CNN输入要求,最终shape为(100, 128, 128, 1) batch_input = np.expand_dims(batch_input, axis=-1) # 归一化到模型要求的数值范围(比如0-1) batch_input = (batch_input - batch_input.min()) / (batch_input.max() - batch_input.min())
处理后的batch_input可直接输入2D模型进行推理,省略读写文件的IO开销。
内容的提问来源于stack exchange,提问作者Rawan
相关产品推荐
相关产品推荐

