我已经成功地用一张图像构建了 dicom,但我找不到添加更多图像的方法......
我认为问题可能出在我的像素阵列中,任何人都可以帮我纠正它吗?
# Populate required values for file meta information
meta = pydicom.Dataset()
meta.TransferSyntaxUID = pydicom.uid.ExplicitVRLittleEndian
meta.MediaStorageSOPClassUID = pydicom._storage_sopclass_uids.MRImageStorage
meta.MediaStorageSOPInstanceUID = pydicom.uid.generate_uid()
# build dataset
ds = Dataset()
ds.file_meta = meta
ds.fix_meta_info()
# unknown options
ds.is_little_endian = True
ds.is_implicit_VR = False
ds.SOPClassUID = pydicom._storage_sopclass_uids.MRImageStorage
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.InstanceNumber = 1
ds.ImagePositionPatient = r"0\0\1"
ds.ImageOrientationPatient = r"1\0\0\0\-1\0"
ds.ImageType = r"ORIGINAL\PRIMARY\AXIAL"
ds.RescaleIntercept = "0"
ds.RescaleSlope = "1"
ds.PixelRepresentation = 1
# Case options
ds.PatientName = "Anonymous"
ds.PatientID = "123456"
ds.Modality = "MR"
ds.StudyDate = '20200225'
ds.ContentDate = '20200225'
def ensure_even(stream):
# Very important for some viewers
if len(stream) % 2:
return stream + b"\x00"
return stream
pixel_data_list = []
for root, dir, filenames in walk(folder):
filenames.sort(key=natural_keys)
for filename in filenames:
filename = folder + filename
# convert image to grayscale
img = Image.open(filename).convert('L')
img.save(filename)
# open image, decode and ensure_even stream
with open(filename, 'rb') as f:
arr = decode(f)
pixel_data_list.append(arr.tobytes())
# required for pixel handler
ds.BitsStored = 8
ds.BitsAllocated = 8
ds.HighBit = 7
ds.PixelRepresentation = 0
# grayscale without compression
ds.PhotometricInterpretation = "MONOCHROME2"
ds.SamplesPerPixel = 1 # 1 color = 1 sampleperpixel
ds.file_meta.TransferSyntaxUID = pydicom.uid.ExplicitVRLittleEndian
ds.PixelData = array(pixel_data_list)
ds.NumberOfFrames = len(pixel_data_list)
# Image shape
ds['PixelData'].is_undefined_length = False
ds.Columns = img.width
ds.Rows = img.height
# validate and save
pydicom.dataset.validate_file_meta(ds.file_meta, enforce_standard=True)
new_filename = filename.replace('.jpg', name + '.dcm')
ds.save_as(new_filename, write_like_original=False)
似乎也无法压缩图像,只能单色工作(请参阅此处的尝试https://stackoverflow.com/a/68939321/1827162 https://stackoverflow.com/a/68939321/1827162)...
但这并不是什么问题,最重要的是能够添加多个图像。感谢您的指点!
像素数据应该bytes
。如果您的传输语法未压缩,那么您需要将数据连接在一起,如果连接数据的长度是奇数,那么您必须添加一个尾随填充字节:
# For uncompressed transfer syntaxes only!
pixel_data = b"".join(pixel_data_list)
ds.PixelData = pixel_data + b"\x00" if len(pixel_data) % 2 else pixel_data
对于压缩传输语法,您必须使用封装 https://stackoverflow.com/questions/58518357/how-to-create-jpeg-compressed-dicom-dataset-using-pydicom/59499693#59499693
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)