我正在使用 pydicom.read_file()
在 DICOM 中读取内容,如下所示:
x = pydicom.read_file(/path/to/dicom/)
这会返回 FileDataset
的实例,但在尝试访问如下值时出现错误:
x[0x20,0x32]
OUTPUT: *** KeyError: (0020, 0032)
我也尝试过像这样访问该值:
x.ImagePositionPatient
OUTPUT: *** AttributeError: 'FileDataset' object has no attribute 'ImagePositionPatient'
这让我感到困惑的原因是,当我使用 x.values
查看所有值时,我发现该字段实际上存在:
(0020, 0032) Image Position (Patient)
如果我能清楚地看到 key 存在,它怎么可能会丢失?
我不是 PyDICOM 专家,但它应该像常规 Python 字典一样工作。
最佳答案
对于增强型 SOP 类别(增强型 CT、增强型 MR 等),许多标签位于序列中:在 Shared Functional Groups Sequence 中对于所有切片通用的标签,以及 Per frame Functional Groups Sequence 中对于特定于每个切片的标签,每个切片都有一个项目。
(请注意,这些链接特定于增强型 MR,以匹配您的数据集)
图像位置(患者)
是特定于切片的标签,因此您可以访问相应项目中每个切片的值。功能组序列不直接包含标签,但它们嵌套在另一个序列中 - 在图像位置(患者)
的情况下,这是 Plane Position Sequence 。要在 pydicom
中访问这些值,您可以执行以下操作:
ds = dcmread(filename)
positions = []
for item in ds.PerFrameFunctionalGroupsSequence:
positions.append(item.PlanePositionSequence[0].ImagePositionPatient)
print(positions)
这将为您提供每个切片的图像位置。 当然,您应该检查是否具有正确的 SOP 类,并添加对标签是否存在的检查。根据您的用例,您可能只需要这些位置中的第一个,在这种情况下,您不必迭代这些项目。
关于python - 即使字段存在,PyDICOM也会返回KeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74776837/