You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将DICOM文件列表转换为单个numpy数组.npy文件?

批量将DICOM序列转换为单个.npy文件的正确方法

你的核心问题是循环中存储的是pydicom的Dataset对象而非像素数组,另外还需要注意DICOM切片的顺序问题(默认文件列表不一定对应身体层面的顺序),以下是完整的解决流程:

步骤说明

  1. 读取所有DICOM文件时,提取每个切片的pixel_array(原始像素数据)和用于排序的元数据(比如InstanceNumber,即切片序号)
  2. 按切片序号排序,确保3D数组的层面顺序正确
  3. 将所有切片堆叠为一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:05:30