如何正确将3D .nii文件转换为符合维度要求的2D切片.tiff文件
NII转2D切片堆叠TIFF的正确实现
问题根源
nibabel读取的.nii文件返回的数组轴顺序为(单切片高度, 单切片宽度, 切片总数),读取得到的(512, 512, 300)形状对应512×512分辨率、共300张切片。直接调用保存接口时,tifffile会按原始轴顺序写入文件,因此读取时维度不会发生变化,不符合多页2D切片TIFF要求的(切片数, 高度, 宽度)轴顺序。
修正后代码
核心需要做轴顺序转置,可选做方位校正、像素值归一化处理,代码如下:
import nibabel as nib import numpy as np import tifffile as tiff # 加载nii文件 nii_arr = nib.load('/a.nii').get_fdata() print(f"原始nii数组形状:{nii_arr.shape}") # 输出 (512, 512, 300) # 核心步骤:调整轴顺序,将切片维度移动到第一维,转换为(切片数, 高度, 宽度)格式 transposed_arr = np.transpose(nii_arr, (2, 0, 1)) print(f"转置后数组形状:{transposed_arr.shape}") # 输出 (300, 512, 512),符合预期 # --- 可选校正项:根据实际扫描方位调整,避免切片顺序/方向错误 --- # 切片顺序颠倒时取消注释下行 # transposed_arr = transposed_arr[::-1, :, :] # 单切片上下翻转时取消注释下行 # transposed_arr = transposed_arr[:, ::-1, :] # 单切片左右翻转时取消注释下行 # transposed_arr = transposed_arr[:, :, ::-1] # 可选:数据类型转换,避免文件过大、兼容普通图像查看器 # 将像素值归一化到0-255范围,转为8位灰度图格式 normalized_arr = ((transposed_arr - transposed_arr.min()) / (transposed_arr.max() - transposed_arr.min()) * 255).astype(np.uint8) # 保存为多页TIFF,每一页对应一张独立2D切片 tiff.imwrite('/2da.tiff', normalized_arr) # 验证读取结果 tiff_arr = tiff.imread('/2da.tiff') print(f"生成TIFF的数组形状:{tiff_arr.shape}") # 输出 (300, 512, 512)
注意事项
- 若需要保留原始像素精度(比如医学影像的原始CT值),可以跳过归一化步骤直接保存转置后的数组,但部分通用图像查看软件可能无法正常显示float格式的TIFF,建议根据使用场景选择是否做类型转换
- 方位校正没有通用参数,建议先抽取中间位置的几张切片单独保存查看方向,确认正确后再做全量转换
- 直接使用
tifffile.imwrite接口保存即可,旧版本的imsave接口存在兼容性问题,不建议使用
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

