[英]SimpleItk - writing a DICOM image using 12 bits (BitsAllocated=16, BitsStored=12)
I have an original DICOM file that has DICOM tags BitsAllocated (0028|0100)=16 and BitsStored (0028|0101)=12.我有一个原始 DICOM 文件,其中有 DICOM 标签 BitsAllocated (0028|0100)=16 和 BitsStored (0028|0101)=12。 I use SimpleITK to read this series, modify it and then I would like to save it again as a DICOM series using the same values for the two tags specified above.
我使用 SimpleITK 来阅读这个系列,修改它,然后我想使用上面指定的两个标签的相同值再次将它保存为 DICOM 系列。 After modifying the dataset the data format is uint16.
修改数据集后数据格式为uint16。
This is the code I use:这是我使用的代码:
writer = sitk.ImageFileWriter()
writer.KeepOriginalImageUIDOn()
# Copy relevant tags from the original meta-data dictionary (private tags are also accessible).
tags_to_copy = ["0010|0010", # Patient Name
"0010|0020", # Patient ID
"0010|0030", # Patient Birth Date
"0020|000D", # Study Instance UID, for machine consumption
"0020|0010", # Study ID, for human consumption
"0008|0020", # Study Date
"0008|0030", # Study Time
"0008|0050", # Accession Number
"0008|0060" # Modality
]
modification_time = time.strftime("%H%M%S")
modification_date = time.strftime("%Y%m%d")
# Copy some of the tags and add the relevant tags indicating the change.
# For the series instance UID (0020|000e), each of the components is a number, cannot start
# with zero, and separated by a '.' We create a unique series ID using the date and time.
# tags of interest:
direction = sitk_stack.GetDirection()
series_tag_values = [(k, rs.GetMetaData(0, k)) for k in tags_to_copy if rs.HasMetaDataKey(0, k)] + \
[("0008|0031", modification_time), # Series Time
("0008|0021", modification_date), # Series Date
("0008|0008", "DERIVED\\SECONDARY"), # Image Type
("0020|000e", "1.2.826.0.1.3680043.2.1125." + modification_date + ".1" + modification_time), # Series Instance UID
("0020|0037", '\\'.join(map(str, (direction[0], direction[3], direction[6], # Image Orientation (Patient)
direction[1], direction[4], direction[7])))),
("0008|103e", rs.GetMetaData(0, "0008|103e") + " Processed-SimpleITK"),
("0028|0101", '12'), # gray values window
("0028|0102", '11'), # gray values window
("0028|0100", '16'),
('0028|0103', '0'), ]
for i in range(sitk_stack.GetDepth()):
image_slice = sitk_stack[:, :, i]
# Tags shared by the series.
for tag, value in series_tag_values:
image_slice.SetMetaData(tag, value)
# Slice specific tags.
image_slice.SetMetaData("0008|0012", time.strftime("%Y%m%d")) # Instance Creation Date
image_slice.SetMetaData("0008|0013", time.strftime("%H%M%S")) # Instance Creation Time
image_slice.SetMetaData("0020|0032", '\\'.join(map(str, sitk_stack.TransformIndexToPhysicalPoint((0, 0, i))))) # Image Position (Patient)
image_slice.SetMetaData("0020,0013", str(i)) # Instance Number
# Write to the output directory and add the extension dcm, to force writing in DICOM format.
writer.SetFileName(os.path.join(output_dir, str(i) + '.dcm'))
writer.Execute(image_slice)
''' '''
When I look at the images afterwards using MeVisLab, I notice that the BitsAlocated and BitsStored are both 16 rather than 16 and 12. What am I doing wrong?当我之后使用 MeVisLab 查看图像时,我注意到 BitsAlocated 和 BitsStored 都是 16 而不是 16 和 12。我做错了什么? Is it possible to store the images using only 12 bits?
是否可以仅使用 12 位存储图像?
SimpleITK doesn't support 12-bit pixels, so it cannot write them. SimpleITK 不支持 12 位像素,因此无法写入它们。 Because of that, when a 12-bit pixel image is read, it automatically gets converted to 16-bit.
因此,当读取 12 位像素图像时,它会自动转换为 16 位。
I don't know of python DICOM packages that support writing of 12-bit pixel images.我不知道支持写入 12 位像素图像的 python DICOM 包。 SimpleITK uses GDCM or DCMTK for DICOM I/O.
SimpleITK 将 GDCM 或 DCMTK 用于 DICOM I/O。 If you use those libraries directly, you might be able to do it, although I don't know.
如果你直接使用这些库,你也许可以做到,虽然我不知道。 But via SimpleITK you can't.
但是通过 SimpleITK 你不能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.