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

如何使用RAD-ChestCT的NPZ文件并转换为DICOM/Pydicom格式

1. 使用RAD-ChestCT的NPZ格式数据集

NPZ是numpy的压缩数组格式,加载和使用步骤如下:

  • 导入numpy库并加载NPZ文件:
    import numpy as np
    data = np.load("your_dataset_file.npz")
    
  • 查看文件内包含的数组键名(通常会有image、label这类键):
    print(data.files)
    
  • 提取CT扫描数据数组:
    ct_scan = data["image"]
    # 数组维度一般为 (切片数, 图像高度, 图像宽度),即 (z, y, x)
    
  • 用matplotlib快速查看任意切片:
    import matplotlib.pyplot as plt
    plt.imshow(ct_scan[50], cmap="gray")  # 查看第51个切片(索引从0开始)
    plt.show()
    
2. 将NPZ转换为Pydicom格式

DICOM不仅包含像素数据,还需要完整的元数据(扫描参数、患者信息等),需构建DICOM模板后填充数据:

  1. 安装依赖:
    pip install pydicom numpy
    
  2. 完整转换代码示例(可根据医院DICOM的参数调整元数据):
    import numpy as np
    import pydicom
    from pydicom.uid import generate_uid
    from pydicom.dataset import Dataset, FileMetaDataset
    
    # 加载NPZ中的CT数据
    npz_data = np.load("rad-chestct.npz")
    ct_array = npz_data["image"].astype(np.int16)  # 转换为DICOM常用的int16类型
    num_slices, height, width = ct_array.shape
    
    # 构建DICOM文件元数据
    file_meta = FileMetaDataset()
    file_meta.MediaStorageSOPClassUID = "1.2.840.10008.5.1.4.1.1.2"  # CT图像标准SOP类UID
    file_meta.MediaStorageSOPInstanceUID = generate_uid()
    file_meta.ImplementationClassUID = generate_uid()
    file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian
    
    # 构建基础数据集模板
    base_ds = Dataset()
    base_ds.file_meta = file_meta
    base_ds.is_little_endian = True
    base_ds.is_implicit_VR = True
    base_ds.StudyInstanceUID = generate_uid()
    base_ds.SeriesInstanceUID = generate_uid()
    base_ds.PatientName = "Anonymous"
    base_ds.PatientID = "RAD-ChestCT-001"
    base_ds.Modality = "CT"
    base_ds.Rows = height
    base_ds.Columns = width
    base_ds.SamplesPerPixel = 1
    base_ds.PhotometricInterpretation = "MONOCHROME2"
    base_ds.BitsAllocated = 16
    base_ds.BitsStored = 12
    base_ds.HighBit = 11
    base_ds.PixelRepresentation = 1  # 有符号整数(对应HU值)
    base_ds.SliceThickness = 1.0  # 可根据实际扫描参数调整
    base_ds.SpacingBetweenSlices = 1.0
    base_ds.ImageOrientationPatient = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0]
    
    # 逐个切片生成DICOM文件
    for slice_idx in range(num_slices):
        ds = base_ds.copy()
        ds.SOPInstanceUID = generate_uid()
        ds.InstanceNumber = slice_idx + 1
        # 调整Z轴位置(根据切片厚度计算)
        ds.ImagePositionPatient = [0.0, 0.0, slice_idx * base_ds.SliceThickness]
        # 填充像素数据
        ds.PixelData = ct_array[slice_idx].tobytes()
        # 保存单个DICOM文件
        ds.save_as(f"ct_slice_{slice_idx+1}.dcm", write_like_original=False)
    

    注意:元数据(如SliceThickness、SpacingBetweenSlices)建议参考你使用的医院DICOM参数设置,确保和测试/验证数据的格式一致。

3. NPZ转NIfTI格式的方案

使用nibabel库可以快速完成转换,步骤如下:

  1. 安装依赖:
    pip install numpy nibabel
    
  2. 转换代码示例:
    import numpy as np
    import nibabel as nib
    
    # 加载NPZ数据
    npz_data = np.load("rad-chestct.npz")
    ct_array = npz_data["image"]
    
    # 构建affine矩阵(定义图像空间坐标,可根据实际扫描参数调整)
    # 示例:若x/y方向像素间距0.5mm,z方向切片厚度1mm,可设置:
    # affine = np.diag([0.5, 0.5, 1.0, 1.0])
    affine = np.eye(4)  # 若无精确参数,可用单位矩阵
    
    # 创建并保存NIfTI文件
    nifti_img = nib.Nifti1Image(ct_array, affine)
    nib.save(nifti_img, "rad-chestct.nii.gz")
    

内容的提问来源于stack exchange,提问作者Bonaventura RS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:51:02