如何使用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模板后填充数据:
- 安装依赖:
pip install pydicom numpy - 完整转换代码示例(可根据医院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库可以快速完成转换,步骤如下:
- 安装依赖:
pip install numpy nibabel - 转换代码示例:
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
相关产品推荐
相关产品推荐

