<div dir="ltr"><div><div><div>Hi,<br><br></div>I need some help with how to correctly access the DICOM meta data dictionary using Python wrapped ITK (v.4.5).  My CT scans are scanned with gantry tilt which I need to correct with a shear transform prior to segmenting.  The gantry tilt angle is stored in the DICOM header under tag (0018, 1120)<br>
<br></div>example:<br><br>import itk<br><br>imdir = '/path/to/images'<br>image_t = itk.Image[itk.F, 3]<br><br></div><div>#set up reader<br></div><div>reader = itk.ImageSeriesReader[image_t].New()<br>dicomIO = itk.GDCMImageIO.New()<br>
dicomFN = itk.GDCMSeriesFileNames.New()<br>reader.SetImageIO(dicomIO)<br><br></div><div>#get file names<br></div><div>dicomFN.SetUseSeriesDetails(True)<br>dicomFN.SetDirectory(imdir)<br><br></div><div>#get the first image series<br>
</div><div>uids = dicomFN.GetSeriesUIDs()<br>fnames = dicomFN.GetFileNames(uids[0])<br><br></div><div>#read in the files<br></div><div>reader.SetFileNames(fnames)<br>reader.Update()<br>image = reader.GetOutput()<br><br></div>
#getting the image works fine.  Now to access the meta data dictionary<br><div><div>metad = dicomIO.GetMetaDataDictionary()<br><br></div><div>#get the entry for gantry tilt using the relevant DICOM tag (0018, 1120)<br></div>
<div>tilt = metad.Get('0018|1120')  <br><br></div><div>At this point I am stuck.  tilt is of type itkMetaDataObjectBase, rather than one the derived classes specific to strings, floats etc..  itkMetaDataObjectBase does not contain the GetMetaDataObjectValue() method, whereas the derived classes do.<br>
<br></div><div>In the ITK manual, the C++ example uses a dynamic_cast at the type the tag is extracted so that 'tilt' would be of one the derived class types.  I have tried the following:<br></div><div><br></div><div>
sst = itk.MetaDataObject.SS<br>tilt.__class__ = sst<br></div><div>tilt.GetMetaDataObjectValue()<br><br></div><div>casting tilt does work, and the GetMetaDataObjectValue() method is now present as one of tilt's attributes, but just returns an error if executed.<br>
<br></div><div>The other approach I have tried is to use the dicomIO.GetValueFromTag() method.  From the source file the method signature is<br>

<p style="margin:0px;text-indent:0px"><br></p><p style="margin:0px;text-indent:0px">GetValueFromTag(self, string tag, string value)</p><p style="margin:0px;text-indent:0px"><br></p>'value' is, I presume, meant to be the name of the variable created containing the tilt angle.  However if I try:  <br>
<br></div><div>dicomIO.GetValueFromTag('0018|1120', 't_angle')<br><br></div><div>I get the error <br>   in method 'itkGDCMImageIO_GetValueFromTag', argument 3 of type 'std::string &<br><br>
</div><div>I would be tremendously grateful for any pointers on how to access the tag data - it must be a routine operation for people using Python/ITK on DICOM images!<br><br></div><div>Many thanks<br>Mat<br></div><div><br>
</div></div></div>