5

我正在尝试使用 freesurfer 的dcm2nii实用程序将大量 DTI siemens DICOM 转换为 NifTi,但在某些文件上失败,因为它们缺少DiffusionGradientDirection tag (0x19,0x100E)生成.bvec.bval文件所必需的 . 并不是标签没有值,它们似乎根本不存在。

ds[0x19,0x100E] Traceback(最近一次调用最后):文件“”,第 1 行,在文件“/space/jazz/1/users/gwarner/anaconda/lib/python2.7/site-packages/pydicom-0.9 .9-py2.7.egg/dicom/dataset.py”,第 277 行,在getitem data_elem = dict 中。getitem (self, tag) KeyError: (0019, 100e)

我尝试添加它,但出现以下错误:

ds[0x19,0x100E].value = 'yes' Traceback(最近一次调用最后):文件“”,第 1 行,在文件“/space/jazz/1/users/gwarner/anaconda/lib/python2.7/site -packages/pydicom-0.9.9-py2.7.egg/dicom/dataset.py”,第 277 行,在getitem data_elem = dict 中。getitem (self, tag) KeyError: (0019, 100e)

有没有办法手动插入这个标签?

4

2 回答 2

5

要将 pydicom 中的新私有数据元素添加到数据集 ds,add_new可以使用以下方法:

ds.add_new(tag, VR, value)

对于这种情况,在 pydicom 的 _private_dict.py 文件中查找私有标签(源自 gdcm 的私有标签信息):

 'SIEMENS MR HEADER': {
    ...
    '0019xx0e': ('FD', '3', 'DiffusionGradientDirection', ''),

它是一种重复组类型的标记,其中 xx 可以更改以允许同一类型的多个数据元素。这里 FD 是一个双浮点数,3 是多重性(预期三个值)。

所以在这种情况下,添加你需要的数据元素应该是这样的:

ds.add_new(0x19100e, 'FD', [0,1,0]) # I have no idea what this last vector should actually be

但是,正如 malat 指出的那样,还需要一个私有创建者标签来引入块,以使文件成为有效的 DICOM。如果它不存在,您可能还必须添加它。由于您正在将文件转换为另一种格式,因此您可能并不关心它是否仅通过添加单个标签来工​​作。

添加数据元素后,您可以使用ds[0x19100e].value = ...原始问题中的方法更改值。

顺便说一句,add_new标准字典中的关键字不需要;对于那些可以直接按名称设置项目的人,例如ds.OtherPatientIDs='test',即使它在数据集中尚不存在。

于 2017-01-24T02:18:24.100 回答
-1

我需要在这里使用我的水晶球来回答这个问题,因为我无法访问您的 DICOM 数据集,但我敢打赌这对您来说是失败的,因为您对Privates Tags在 DICOM 中的工作方式没有很好的理解。

我发现了一个写得很好的页面(仅在web.archive中可用)总结了这种情况。总之,您需要仔细检查类似dcmdump和/或gdcmdump指导您的输出。

让我们使用著名的 GDCMData 示例文件之一来综合这里发生的事情(但它应该对您同样有效)。

$ gdcmdump SIEMENS_CSA2.dcm | grep 0019
(0019,0010) LO [SIEMENS MR HEADER ]                               # 18,1 Private Creator
(0019,1008) CS [IMAGE NUM 4 ]                                     # 12,1 CSA Image Header Type
(0019,1009) LO [1.0 ]                                             # 4,1 CSA Image Header Version ??
(0019,100b) DS [10632.5 ]                                         # 8,1 SliceMeasurementDuration
(0019,100f) SH [Fast]                                             # 4,1 GradientMode
(0019,1011) SH [No]                                               # 2,1 FlowCompensation
(0019,1012) SL 0\0\-2134                                          # 12,3 TablePositionOrigin
(0019,1013) SL 0\0\-2134                                          # 12,3 ImaAbsTablePosition
(0019,1014) IS [0\0\0 ]                                           # 6,3 ImaRelTablePosition
(0019,1015) FD -162.438\-61.4092\254.003                          # 24,3 SlicePosition_PCS
(0019,1017) DS [0.642857]                                         # 8,1 SliceResolution
(0019,1018) IS [7800]                                             # 4,1 RealDwellTime

正如您在上面看到的,gdcmdump 能够判断 0019,1018 是RealDwellTime

如果我们天真地删除私有创建者标签,现在会发生什么:

$ gdcmanon --dumb --remove 0019,0010 SIEMENS_CSA2.dcm /tmp/hack.dcm
$ gdcmdump /tmp/hack.dcm | grep 0019
(0019,1008) CS [IMAGE NUM 4 ]                                     # 12,? (1)  Private Element With Empty Private Creator
(0019,1009) LO [1.0 ]                                             # 4,? (1)  Private Element With Empty Private Creator
(0019,100b) DS [10632.5 ]                                         # 8,? (1)  Private Element With Empty Private Creator
(0019,100f) SH [Fast]                                             # 4,? (1)  Private Element With Empty Private Creator
(0019,1011) SH [No]                                               # 2,? (1)  Private Element With Empty Private Creator
(0019,1012) SL 0\0\-2134                                          # 12,? (3)  Private Element With Empty Private Creator
(0019,1013) SL 0\0\-2134                                          # 12,? (3)  Private Element With Empty Private Creator
(0019,1014) IS [0\0\0 ]                                           # 6,? (3)  Private Element With Empty Private Creator
(0019,1015) FD -162.438\-61.4092\254.003                          # 24,? (3)  Private Element With Empty Private Creator
(0019,1017) DS [0.642857]                                         # 8,? (1)  Private Element With Empty Private Creator
(0019,1018) IS [7800]                                             # 4,? (1)  Private Element With Empty Private Creator

突然,我们遇到了一个奇怪的情况,即 DICOM 属性 0019,1018 仍然存在于 DataSet 中,但由于“某些”原因 gdcmdump 无法告诉我们这是“RealDwellTime”。

我猜这对您来说也是同样的问题,您缺少用于私有标签间接 ( SIEMENS MR HEADER) 的密钥。


作为旁注,您是否检查过扩散信息未直接存储在 CSA 标头中,例如:

$ gdcmdump --csa my_input.dcm | grep -i diffusion

在这种情况下,我会向 pydicom 报告一个错误,以便他们也解析此 DICOM 属性以检索扩散信息。

于 2017-01-22T16:05:23.837 回答