[ITK-users] reading 3D temporal MRA dicom: miss ordered

Jerome Plumat j.plumat at auckland.ac.nz
Mon May 23 17:54:58 EDT 2016


Dear all,
I'm facing to a problem while reading a 3D Angiography dicom data set 
and transforming it in MHA with ITK 4.8.1. The angiography is a TWIST 
generated by a 3T Siemens scanner. Each slice is a projection of the 
head at a specific time after the contrast agent injection.
The dicom is detected as 3D
(0018,0023) CS [3D]                                     #   2, 1 
MRAcquisitionType

While I try to load the whole dicom with ITK (using the lines below) it 
creates a volume but the slices are not well ordered. Indeed, each slice 
has a timer tag and the generated sequence has is not in the proper order.

Has anyone faced this problem?

Thanks a lot.
Jerome Plumat

Reading the DCM Angiography with:
     const    unsigned int   Dimension = 3;
     typedef  float PixelType;
     typedef  itk::Image<PixelType, Dimension> ImageType;

     typedef unsigned short                DcmPixelType;
     typedef typename itk::Image<DcmPixelType,  3> DCMImageType;
     typedef typename itk::Image<float ,  3>   OutputImageType;
     typedef itk::ImageSeriesReader< DCMImageType > DCMReaderType;
     typedef itk::GDCMSeriesFileNames NamesGeneratorType;
     typedef itk::GDCMImageIO ImageIOType;
     typedef std::vector< std::string > SeriesIdContainer;
     typedef std::vector< std::string > FileNamesContainer;

     ImageIOType::Pointer        dicomIO = ImageIOType::New();
     NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
     DCMReaderType::Pointer reader = DCMReaderType::New();

     reader->SetImageIO( dicomIO );

nameGenerator->SetUseSeriesDetails( true );
// restrict to the serie date
nameGenerator->AddSeriesRestriction("0008|0021" );
nameGenerator->SetDirectory( inputPath ); // m_path designates the DCM 
folder

     const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
     std::string seriesIdentifier = seriesUID.begin()->c_str();
     FileNamesContainer fileNames;
     fileNames = nameGenerator->GetFileNames( seriesIdentifier );
     reader->SetFileNames( fileNames );

     typedef itk::CastImageFilter<  DCMImageType, OutputImageType 
 >          CastFilterType;
     typename CastFilterType::Pointer caster = CastFilterType::New();
     caster->SetInput( reader->GetOutput() );

     // write the volume
     typedef itk::ImageFileWriter< OutputImageType > MetaWriterType;
     MetaWriterType::Pointer writer = MetaWriterType::New();
     writer->SetFileName( outputPath ); // volume.mha
     writer->SetInput( caster->GetOutput() );
     try{
         writer->Update();
     }catch( itk::ExceptionObject &err){
         std::cerr << "Error while writing the volume as: "
             << outputPath << std::endl;
         std::cerr << err << std::endl;
         exit( EXIT_FAILURE );
     }





More information about the Insight-users mailing list