/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkGDCMImageReader2.h" #include "vtkImageChangeInformation.h" #include "vtkStringArray.h" #include "gdcmIPPSorter.h" #ifndef vtkFloatingPointType #define vtkFloatingPointType double #endif /* * Simple example to check computation of spacing within vtkGDCMImageReader2 * This is a direct implementation of: * * http://gdcm.sourceforge.net/wiki/index.php/Using_GDCM_API#Automatic_ordering_of_slices_for_vtkGDCMImageReader.SetFileNames * * For more advanced information on how 3D spacing is being computed see: * * - http://gdcm.sourceforge.net/html/classgdcm_1_1IPPSorter.html * * Usage: * * $ Compute3DSpacing SIEMENS_MAGNETOM-12-MONO2-FileSeq0.dcm \ * SIEMENS_MAGNETOM-12-MONO2-FileSeq1.dcm \ * SIEMENS_MAGNETOM-12-MONO2-FileSeq2.dcm \ * SIEMENS_MAGNETOM-12-MONO2-FileSeq3.dcm */ int main(int argc, char *argv[]) { if( argc < 2 ) return 1; std::vector filenames; for( int i = 1; i < argc; ++i ) { filenames.push_back( argv[i] ); } gdcm::IPPSorter s; s.SetComputeZSpacing( true ); s.SetZSpacingTolerance( 1e-3 ); bool b = s.Sort( filenames ); if( !b ) { std::cerr << "Failed to sort files" << std::endl; return 1; } std::cout << "Sorting succeeded:" << std::endl; //s.Print( std::cout ); std::cout << "Found z-spacing:" << std::endl; std::cout << s.GetZSpacing() << std::endl; const double ippzspacing = s.GetZSpacing(); const std::vector & sorted = s.GetFilenames(); vtkGDCMImageReader2 * reader = vtkGDCMImageReader2::New(); vtkStringArray *files = vtkStringArray::New(); std::vector< std::string >::const_iterator it = sorted.begin(); for( ; it != sorted.end(); ++it) { const std::string &f = *it; files->InsertNextValue( f.c_str() ); } reader->SetFileNames( files ); reader->Update(); const vtkFloatingPointType *spacing = reader->GetOutput()->GetSpacing(); vtkImageChangeInformation *v16 = vtkImageChangeInformation::New(); #if (VTK_MAJOR_VERSION >= 6) v16->SetInputConnection( reader->GetOutputPort() ); #else v16->SetInput( reader->GetOutput() ); #endif v16->SetOutputSpacing( spacing[0], spacing[1], ippzspacing ); v16->Update(); v16->GetOutput()->Print( std::cout ); return 0; }