简体   繁体   English

SimpleItk - 使用 12 位写入 DICOM 图像(BitsAllocated=16, BitsStored=12)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM