如何将DICOM文件列表转换为单个numpy数组.npy文件?
批量将DICOM序列转换为单个.npy文件的正确方法
你的核心问题是循环中存储的是pydicom的Dataset对象而非像素数组,另外还需要注意DICOM切片的顺序问题(默认文件列表不一定对应身体层面的顺序),以下是完整的解决流程:
步骤说明
- 读取所有DICOM文件时,提取每个切片的
pixel_array(原始像素数据)和用于排序的元数据(比如InstanceNumber,即切片序号) - 按切片序号排序,确保3D数组的层面顺序正确
- 将所有切片堆叠为一个3D numpy数组,保存为单个.npy文件
完整代码
import pydicom import glob import numpy as np # 替换为你的DICOM文件目录路径,注意用**匹配子目录(如果有) dicom_path = "path/to/your/dicom/files/*.dcm" # 存储切片的像素数组和对应的序号 slices = [] for f in glob.iglob(dicom_path, recursive=True): # 读取DICOM文件 ds = pydicom.dcmread(f) # 提取像素数组和InstanceNumber(用于排序) slices.append((ds.InstanceNumber, ds.pixel_array)) # 按InstanceNumber排序,保证切片顺序正确 slices.sort(key=lambda x: x[0]) # 提取排序后的像素数组,堆叠成3D数组(形状为:(切片数, 512, 512)) volume = np.array([slice_data for _, slice_data in slices]) # 保存为.npy文件 np.save("patient_volume.npy", volume)
关键注意事项
- 路径匹配:如果DICOM文件在子目录里,要加上
recursive=True,并且路径用**/*.dcm - 排序逻辑:必须用DICOM元数据里的
InstanceNumber排序,不要依赖文件名顺序,否则会导致层面顺序混乱 - 数据类型:DICOM的像素数组可能是16位整数(CT图像常见),直接保存为.npy会保留原始数据类型,不会有画质损失
- 异常处理:如果部分文件没有
InstanceNumber,可以改用ds.SliceLocation(切片位置)排序,或者根据文件名的数字部分提取排序键
内容的提问来源于stack exchange,提问作者Guilherme de Lima Schwaikartt
相关产品推荐
相关产品推荐

