#if defined(_MSC_VER) #pragma warning ( disable : 4786 ) #endif #ifdef __BORLANDC__ #define ITK_LEAN_AND_MEAN #endif /** \brief read DICOM CT and PET series into volumes and then save these volumes in another * file format (MetaImage). */ #include "itkGDCMImageIO.h" #include "itkGDCMSeriesFileNames.h" #include "itkMetaDataDictionary.h" #include "itkMetaDataObject.h" #include "itkImageSeriesReader.h" #include "itkImageFileWriter.h" int main( int argc, char* argv[] ) { if( argc < 3 ) { std::cerr << "Usage: " << std::endl; std::cerr << argv[0] << " DicomDirectory CTFileName PETFileName" << std::endl; return EXIT_FAILURE; } // define the pixel type and dimension of the image to be read. typedef signed short PixelType; const unsigned int Dimension = 3; typedef itk::Image< PixelType, Dimension > ImageType; //use the image type for instantiating the type of the series reader and // for constructing one object of its type. typedef itk::ImageSeriesReader< ImageType > ReaderType; ReaderType::Pointer reader = ReaderType::New(); // A GDCMImageIO object is created and connected to the reader to // to process the Dicom format image typedef itk::GDCMImageIO ImageIOType; ImageIOType::Pointer dicomIO = ImageIOType::New(); reader->SetImageIO( dicomIO ); // read a DICOM series. (identify from a given directory the set of // filenames that belong together to the same volumetric image) we call the // \code{SetUseSeriesDetails(true)} function that tells the GDCMSereiesFileNames // object to use additional DICOM information to distinguish unique volumes // within the directory. typedef itk::GDCMSeriesFileNames NamesGeneratorType; NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New(); nameGenerator->SetUseSeriesDetails( true ); nameGenerator->SetDirectory( argv[1] ); try { std::cout << std::endl << "The image directory: " << std::endl; std::cout << argv[1] << std::endl; // GDCMSeriesFileNames object first identifies the list of DICOM series // that are present in the given directory. typedef std::vector< std::string > SeriesIdContainer; const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs(); SeriesIdContainer::const_iterator seriesItr = seriesUID.begin(); SeriesIdContainer::const_iterator seriesEnd = seriesUID.end(); std::string seriesIdentifier; typedef std::vector< std::string > FileNamesContainer; FileNamesContainer fileNames; typedef itk::ImageFileWriter< ImageType > WriterType; WriterType::Pointer writer = WriterType::New(); int k = 2; do { seriesIdentifier = seriesItr->c_str(); std::cout << std::endl; std::cout << "Now reading series: " << std::endl; std::cout << seriesIdentifier << std::endl; std::cout << std::endl; fileNames = nameGenerator->GetFileNames( seriesIdentifier ); reader->SetFileNames( fileNames ); try{ reader->Update(); }catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } writer->SetFileName( argv[k] ); writer->SetInput( reader->GetOutput() ); std::cout << "Writing the image as " << std::endl; std::cout << argv[k] << std::endl << std::endl; try { writer->Update(); }catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } seriesItr++; k++; } while( seriesItr != seriesEnd ); } catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }