// SliceBySliceMultiFrame.cxx // Read multi-frame images slice by slice and write them to file // Author: Iván Macía (imacia@vicomtech.org) // Date: 08/12/04 #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkRegionOfInterestImageFilter.h" #include "itkGDCMImageIO.h" #include int main( int argc, char ** argv ) { const unsigned int Dimension = 3; typedef short PixelType; typedef itk::Image ImageType; typedef itk::ImageFileReader ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName( argv[1] ); reader->UseStreamingOn(); /*try { reader->Update(); } catch ( itk::ExceptionObject &err) { std::cout << "ExceptionObject caught !" << std::endl; std::cout << err << std::endl; return -1; }*/ // Create an ImageIO for DICOM to read the dimensions of the image without actually reading the image itk::GDCMImageIO::Pointer gdcmIO = itk::GDCMImageIO::New(); gdcmIO->SetFileName( argv[1] ); gdcmIO->ReadImageInformation(); unsigned int numberOfFrames = gdcmIO->GetDimensions(2); // this is the number of frames reader->SetImageIO( gdcmIO ); typedef itk::RegionOfInterestImageFilter ROIFilterType; ROIFilterType::Pointer roiFilter = ROIFilterType::New(); roiFilter->SetInput( reader->GetOutput() ); ImageType::RegionType region; ImageType::SizeType size; ImageType::IndexType startIndex; size[0] = gdcmIO->GetDimensions(0); size[1] = gdcmIO->GetDimensions(1); // get a single frame size[2] = 1; region.SetSize( size ); startIndex.Fill(0); // This should not be necessary /*itk::ImageIORegion ioRegion(Dimension); ioRegion.SetSize( 0, size[0] ); ioRegion.SetSize( 1, size[1] ); ioRegion.SetSize( 2, size[2] ); ioRegion.SetIndex( 0, 0 ); ioRegion.SetIndex( 1, 0 ); ioRegion.SetIndex( 2, 0 ); */ // Write the final result typedef itk::ImageFileWriter WriterType; WriterType::Pointer writer = WriterType::New(); writer->SetInput( roiFilter->GetOutput() ); std::ostringstream fileoutStream; for( unsigned int i=0; iGetImageIO()->SetIORegion( ioRegion ); startIndex[2] = i; region.SetIndex( startIndex ); roiFilter->SetRegionOfInterest( region ); try { roiFilter->Update(); } catch ( itk::ExceptionObject &err) { std::cout << "ExceptionObject caught !" << std::endl; std::cout << err << std::endl; return -1; } fileoutStream.str(""); fileoutStream << "Frame" << i << ".mhd" << std::ends; writer->SetFileName( fileoutStream.str().c_str() ); try { writer->Update(); } catch ( itk::ExceptionObject &err) { std::cout << "ExceptionObject caught !" << std::endl; std::cout << err << std::endl; return -1; } } return EXIT_SUCCESS; }