使用pydicom添加新的DICOM标签

时间:2017-01-20 16:04:26

标签: python dicom pydicom

我试图使用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)

    
  

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

2 个答案:

答案 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属性以检索扩散信息。