我试图使用freesurfer的dcm2nii
实用程序将大量DTI西门子DICOM转换为NifTi,但由于缺少DiffusionGradientDirection tag (0x19,0x100E)
,因此错过了.bvec
生成.bval
和{{1}}文件所必需的。并不是标签没有价值,它们似乎根本就不存在。
DS [0x19,0x100E] Traceback(最近一次调用最后一次): 文件"",第1行,in 文件" /space/jazz/1/users/gwarner/anaconda/lib/python2.7/site-packages/pydicom-0.9.9-py2.7.egg/dicom/dataset.py" ;, line 277,在 getitem data_elem = dict。 getitem (self,tag) KeyError:(0019,100e)
我尝试添加它但出现以下错误:
ds [0x19,0x100E] .value ='是' Traceback(最近一次调用最后一次): 文件"",第1行,in 文件" /space/jazz/1/users/gwarner/anaconda/lib/python2.7/site-packages/pydicom-0.9.9-py2.7.egg/dicom/dataset.py" ;, line 277,在 getitem data_elem = dict。 getitem (self,tag) KeyError:(0019,100e)
有没有办法手动插入这个标签?
答案 0 :(得分:3)
要将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'
,即使数据集中尚不存在。
答案 1 :(得分:0)
我需要在这里使用我的水晶球来回答这个问题,因为我无法访问你的DICOM数据集,但我敢打赌这对你来说是失败的,因为你对{{3}没有很好的理解在DICOM中工作。
我找到了一个相当好的书面页面(仅在Privates Tags中提供),总结了这种情况。总而言之,您需要仔细检查${__time + 1000 * 60 * 5}
和/或dcmdump
之类的输出,以指导您。
让我们使用一个着名的GDCMData示例文件合成这里发生的事情(但它应该对你有效)。
gdcmdump
如您所见,gdcmdump能够判断0019,1018是$ 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
如果我们天真删除私人创建者标签,现在会发生什么:
RealDwellTime
突然间,我们遇到了奇怪的情况,其中DICOM属性0019,1018仍然出现在DataSet中,但对于某些人来说,有些'原因gdcmdump无法告诉我们这是' 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
)。
作为旁注,你是否检查过扩散信息没有直接存储在CSA标题中,例如:
SIEMENS MR HEADER
在这种情况下,我会向pydicom报告错误,以便他们也解析此DICOM属性以检索扩散信息。