Compute3DSpacing.cxx
/*=========================================================================
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 "vtkVersion.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<std::string> 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<std::string> & 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;
}
gdcm::IPPSorter
IPPSorter.
Definition gdcmIPPSorter.h:44
gdcm::IPPSorter::SetComputeZSpacing
void SetComputeZSpacing(bool b)
Definition gdcmIPPSorter.h:64
gdcm::IPPSorter::Sort
bool Sort(std::vector< std::string > const &filenames) override
gdcm::IPPSorter::SetZSpacingTolerance
void SetZSpacingTolerance(double tol)
Definition gdcmIPPSorter.h:68
gdcm::IPPSorter::GetZSpacing
double GetZSpacing() const
Definition gdcmIPPSorter.h:94
gdcm::Sorter::GetFilenames
const std::vector< std::string > & GetFilenames() const
Definition gdcmSorter.h:51
vtkGDCMImageReader2
Definition vtkGDCMImageReader2.h:96
vtkGDCMImageReader2::New
static vtkGDCMImageReader2 * New()
gdcmIPPSorter.h
vtkGDCMImageReader2.h