GDCM  2.4.5
CreateFakePET.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 "vtkImageReader.h"
#include "vtkImageCast.h"
#include "vtkImageData.h"
#include "vtkPointData.h"
#include "vtkDataArray.h"
#include "vtkMedicalImageProperties.h"
#include "vtkStringArray.h"
#include "gdcmTrace.h"
#include "gdcmReader.h"
#include "gdcmWriter.h"
#include "gdcmAttribute.h"
/*
* Minimal example to create a fake RTDOSE file. The data contains a sphere
* just for testing.
* The vtkMedicalImageProperties is not properly filled, but only contains a
* single field which is required to set the proper SOP Class
*/
int main(int, char *[])
{
const vtkIdType xSize = 512;
const vtkIdType ySize = 512;
const vtkIdType zSize = 512;
// Create the filenames in advance to supply to the vtkGDCMImageWriter
std::ostringstream os;
os << "PT";
os << "%03d.dcm";
fg.SetPattern( os.str().c_str() );
unsigned int nfiles = zSize;
fg.SetNumberOfFilenames( nfiles );
bool b = fg.Generate();
if( !b )
{
std::cerr << "FilenameGenerator::Generate() failed" << std::endl;
return 1;
}
{
std::cerr << "FilenameGenerator::Generate() failed somehow..." << std::endl;
return 1;
}
vtkStringArray *filenames = vtkStringArray::New();
for(unsigned int i = 0; i < fg.GetNumberOfFilenames(); ++i)
{
filenames->InsertNextValue( fg.GetFilename(i) );
}
vtkImageData *image = vtkImageData::New();
image->SetDimensions(xSize,ySize,zSize);
image->SetOrigin(-350.684,350.0,890.76);
image->SetSpacing(5.4688,-5.4688,-3.27);
#if VTK_MAJOR_VERSION <= 5
image->SetNumberOfScalarComponents(1);
image->SetScalarTypeToDouble();
#else
image->AllocateScalars(VTK_DOUBLE ,1);
#endif
double pt[3];
for( int z = 0; z < zSize; ++z )
for( int y = 0; y < ySize; ++y )
for( int x = 0; x < xSize; ++x )
{
pt[0] = x;
pt[1] = y;
pt[2] = z;
pt[0] -= xSize / 2;
pt[1] -= ySize / 2;
pt[2] -= zSize / 2;
pt[0] /= xSize / 2;
pt[1] /= ySize / 2;
pt[2] /= zSize / 2;
const double unit = pt[0] * pt[0] + pt[1] * pt[1] + pt[2] * pt[2];
const double inval = unit <= 1. ? (3 * unit + 7) : 0.; // just for fun => max == 10.
double* pixel= static_cast<double*>(image->GetScalarPointer(x,y,z));
pixel[0] = inval;
}
writer->SetFileDimensionality( 2 );
writer->SetFileNames(filenames);
#if (VTK_MAJOR_VERSION >= 6)
writer->SetInputData( image );
#else
writer->SetInput( image );
#endif
writer->GetMedicalImageProperties()->SetSliceThickness("1.5");
writer->GetMedicalImageProperties()->SetModality( "PT" );
writer->SetScale( 0.0042 ); // why not
writer->Write();
image->Delete();
writer->Delete();
return 0;
}

Generated on Fri Sep 25 2015 17:58:19 for GDCM by doxygen 1.8.9.1
SourceForge.net Logo