如何在Python中从数组写入DICOM文件?

问题描述 投票:0回答:1

我正在编写一段代码,在 Python 中从数组创建 DICOM 文件。因此该函数采用 3D 数组并为 z 维度中的每个切片创建 DICOM。 当我使用 pydicom 读取创建的 DICOM 文件时,出现错误: 数据集中像素数据的长度(524288 字节)与预期长度(5242880 字节)不匹配。数据集可能已损坏,或者像素数据处理程序可能存在问题。

有人可以帮我修改我的代码吗?我做错了什么?

def dicom_gen(NPS3Darray,像素间距,切片厚度,文件夹名称):

parent_dir = "/Users/Desktop/test NPS3D/"
path = os.path.join(parent_dir, folder_name) 
os.mkdir(path) 

i = 1
slices = np.shape(NPS3Darray)[0]
rows = np.shape(NPS3Darray)[1]
cols = np.shape(NPS3Darray)[2]
while i <= slices:
    image2d = []
    image2d = NPS3Darray[(i-1),:, :].astype(np.uint16)
    meta = pydicom.Dataset()
    meta.MediaStorageSOPClassUID = pydicom._storage_sopclass_uids.CTImageStorage
    meta.MediaStorageSOPInstanceUID = pydicom.uid.generate_uid()
    meta.TransferSyntaxUID = pydicom.uid.ExplicitVRLittleEndian
    
    
    ds = Dataset()
    ds.file_meta = meta

    ds.is_little_endian = True
    ds.is_implicit_VR = False

    ds.SOPClassUID = pydicom._storage_sopclass_uids.CTImageStorage
    ds.PatientName = "Test^Firstname"
    ds.PatientID = "123456"

    ds.Modality = "CT"
    ds.SeriesInstanceUID = pydicom.uid.generate_uid()
    ds.StudyInstanceUID = pydicom.uid.generate_uid()
    ds.FrameOfReferenceUID = pydicom.uid.generate_uid()
    
    ds.BitsStored = 16
    ds.BitsAllocated = 16
    ds.SamplesPerPixel = 1
    ds.HighBit = 15

    #ds.ImagesInAcquisition = "1"

    ds.Rows = image2d.shape[0]
    ds.Columns = image2d.shape[1]
    ds.InstanceNumber = i
    ds.SliceLocation = i*slice_thickness
    ds.SliceThickness = slice_thickness

    ds.PatientOrientation = r"L\P"
    ds.ImageType = r"ORIGINAL\PRIMARY\AXIAL"
    
    
    ds.ImagePositionPatient = r"-120.8572\-120.8572\%.2f" % (787.50+i*slice_thickness)
    ds.ImageOrientationPatient = r"1.00000\0.00000\0.00000\0.00000\1.00000\0.00000"

    ds.RescaleIntercept = "0"
    ds.RescaleSlope = "1"
    ds.PixelSpacing = r"%.3f\%.3f" % (pixel_spacing, pixel_spacing)
    ds.PhotometricInterpretation = "MONOCHROME2"
    ds.PixelRepresentation = 1
    
    
    ds.NumberOfFrames = slices
    ds.Rows = rows
    ds.Columns = cols

    pydicom.dataset.validate_file_meta(ds.file_meta, enforce_standard=True)
    ds.PixelData = image2d.tobytes()

    ds.save_as(r"%s/slice%s.dcm" % (path, i), write_like_original=False)
    i += 1
python image-processing dicom pydicom
1个回答
0
投票

看起来 NumberOfFrames 应该是 1,因为您将每个切片存储在它自己的文件中。如果您有 10 个切片,它们可以解释实际字节与预期字节之间的 10 倍差异。

© www.soinside.com 2019 - 2024. All rights reserved.