<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hello everybody,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I downloaded AffineTranformation form Wiki Example and modify it to affine two DICOM files. I build it successfully. But when I run it. It have a error messenger:<o:p></o:p></p><p class=MsoNormal>terminate called after throwing an instance of 'itk::ExceptionObject'<o:p></o:p></p><p class=MsoNormal> what(): /usr/local/include/ITK-4.4/itkImageFileWriter.hxx:123:<o:p></o:p></p><p class=MsoNormal>itk::ERROR: ImageFileWriter(0x9808fd8): No filename was specified<o:p></o:p></p><p class=MsoNormal>Aborted (core dumped)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This is my editing code. Please help me edit it. I am using ITK version newest 4.3.1 for Linux<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#include "itkCastImageFilter.h"<o:p></o:p></p><p class=MsoNormal>#include "itkEllipseSpatialObject.h"<o:p></o:p></p><p class=MsoNormal>#include "itkImage.h"<o:p></o:p></p><p class=MsoNormal>#include "itkImageRegistrationMethod.h"<o:p></o:p></p><p class=MsoNormal>#include "itkLinearInterpolateImageFunction.h"<o:p></o:p></p><p class=MsoNormal>#include "itkImageFileReader.h"<o:p></o:p></p><p class=MsoNormal>#include "itkImageFileWriter.h"<o:p></o:p></p><p class=MsoNormal>#include "itkMeanSquaresImageToImageMetric.h"<o:p></o:p></p><p class=MsoNormal>#include "itkRegularStepGradientDescentOptimizer.h"<o:p></o:p></p><p class=MsoNormal>#include "itkResampleImageFilter.h"<o:p></o:p></p><p class=MsoNormal>#include "itkRescaleIntensityImageFilter.h"<o:p></o:p></p><p class=MsoNormal>#include "itkSpatialObjectToImageFilter.h"<o:p></o:p></p><p class=MsoNormal>#include "itkAffineTransform.h"<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#include "itkGDCMImageIO.h"<o:p></o:p></p><p class=MsoNormal>// Software Guide : EndCodeSnippet<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#include <list><o:p></o:p></p><p class=MsoNormal>#include <fstream><o:p></o:p></p><p class=MsoNormal>const unsigned int Dimension = 2;<o:p></o:p></p><p class=MsoNormal>typedef unsigned char PixelType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>typedef itk::Image< PixelType, Dimension > ImageType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>static void CreateEllipseImage(ImageType::Pointer image);<o:p></o:p></p><p class=MsoNormal>static void CreateSphereImage(ImageType::Pointer image);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>int main(int, char *[] )<o:p></o:p></p><p class=MsoNormal>{<o:p></o:p></p><p class=MsoNormal> // The transform that will map the fixed image into the moving image.<o:p></o:p></p><p class=MsoNormal> typedef itk::AffineTransform< double, Dimension > TransformType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // An optimizer is required to explore the parameter space of the transform<o:p></o:p></p><p class=MsoNormal> // in search of optimal values of the metric.<o:p></o:p></p><p class=MsoNormal> typedef itk::RegularStepGradientDescentOptimizer OptimizerType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // The metric will compare how well the two images match each other. Metric<o:p></o:p></p><p class=MsoNormal> // types are usually parameterized by the image types as it can be seen in<o:p></o:p></p><p class=MsoNormal> // the following type declaration.<o:p></o:p></p><p class=MsoNormal> typedef itk::MeanSquaresImageToImageMetric<<o:p></o:p></p><p class=MsoNormal> ImageType,<o:p></o:p></p><p class=MsoNormal> ImageType > MetricType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Finally, the type of the interpolator is declared. The interpolator will<o:p></o:p></p><p class=MsoNormal> // evaluate the intensities of the moving image at non-grid positions.<o:p></o:p></p><p class=MsoNormal> typedef itk:: LinearInterpolateImageFunction<<o:p></o:p></p><p class=MsoNormal> ImageType,<o:p></o:p></p><p class=MsoNormal> double > InterpolatorType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // The registration method type is instantiated using the types of the<o:p></o:p></p><p class=MsoNormal> // fixed and moving images. This class is responsible for interconnecting<o:p></o:p></p><p class=MsoNormal> // all the components that we have described so far.<o:p></o:p></p><p class=MsoNormal> typedef itk::ImageRegistrationMethod<<o:p></o:p></p><p class=MsoNormal> ImageType,<o:p></o:p></p><p class=MsoNormal> ImageType > RegistrationType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Create components<o:p></o:p></p><p class=MsoNormal> MetricType::Pointer metric = MetricType::New();<o:p></o:p></p><p class=MsoNormal> TransformType::Pointer transform = TransformType::New();<o:p></o:p></p><p class=MsoNormal> OptimizerType::Pointer optimizer = OptimizerType::New();<o:p></o:p></p><p class=MsoNormal> InterpolatorType::Pointer interpolator = InterpolatorType::New();<o:p></o:p></p><p class=MsoNormal> RegistrationType::Pointer registration = RegistrationType::New();<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Each component is now connected to the instance of the registration method.<o:p></o:p></p><p class=MsoNormal> registration->SetMetric( metric );<o:p></o:p></p><p class=MsoNormal> registration->SetOptimizer( optimizer );<o:p></o:p></p><p class=MsoNormal> registration->SetTransform( transform );<o:p></o:p></p><p class=MsoNormal> registration->SetInterpolator( interpolator );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Write the two synthetic inputs<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> typedef itk::Image< PixelType, Dimension > FixedImageType;<o:p></o:p></p><p class=MsoNormal> typedef itk::Image< PixelType, Dimension > MovingImageType;<o:p></o:p></p><p class=MsoNormal> // Software Guide : EndCodeSnippet<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Set up the file readers<o:p></o:p></p><p class=MsoNormal> typedef itk::ImageFileReader< FixedImageType > FixedImageReaderType;<o:p></o:p></p><p class=MsoNormal> typedef itk::ImageFileReader< MovingImageType > MovingImageReaderType;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> FixedImageReaderType::Pointer fixedImageReader = FixedImageReaderType::New();<o:p></o:p></p><p class=MsoNormal> MovingImageReaderType::Pointer movingImageReader = MovingImageReaderType::New();<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> fixedImageReader->SetFileName("fix.dcm" );<o:p></o:p></p><p class=MsoNormal> movingImageReader->SetFileName( "mov.dcm" );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> typedef itk::ImageFileWriter< ImageType > WriterType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> WriterType::Pointer fixedWriter = WriterType::New();<o:p></o:p></p><p class=MsoNormal> //ixedWriter->SetFileName("fixed.png");<o:p></o:p></p><p class=MsoNormal> fixedWriter->SetInput( fixedImageReader->GetOutput());<o:p></o:p></p><p class=MsoNormal> fixedWriter->Update();<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> WriterType::Pointer movingWriter = WriterType::New();<o:p></o:p></p><p class=MsoNormal> // movingWriter->SetFileName("moving.png");<o:p></o:p></p><p class=MsoNormal> movingWriter->SetInput( movingImageReader->GetOutput());<o:p></o:p></p><p class=MsoNormal> movingWriter->Update();<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Set the registration inputs<o:p></o:p></p><p class=MsoNormal> registration->SetFixedImage(fixedImageReader->GetOutput());<o:p></o:p></p><p class=MsoNormal> registration->SetMovingImage(movingImageReader->GetOutput());<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> registration->SetFixedImageRegion(<o:p></o:p></p><p class=MsoNormal> fixedImageReader->GetOutput()->GetLargestPossibleRegion() );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Initialize the transform<o:p></o:p></p><p class=MsoNormal> typedef RegistrationType::ParametersType ParametersType;<o:p></o:p></p><p class=MsoNormal> ParametersType initialParameters( transform->GetNumberOfParameters() );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // rotation matrix<o:p></o:p></p><p class=MsoNormal> initialParameters[0] = 1.0; // R(0,0)<o:p></o:p></p><p class=MsoNormal> initialParameters[1] = 0.0; // R(0,1)<o:p></o:p></p><p class=MsoNormal> initialParameters[2] = 0.0; // R(1,0)<o:p></o:p></p><p class=MsoNormal> initialParameters[3] = 1.0; // R(1,1)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // translation vector<o:p></o:p></p><p class=MsoNormal> initialParameters[4] = 0.0;<o:p></o:p></p><p class=MsoNormal> initialParameters[5] = 0.0;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> registration->SetInitialTransformParameters( initialParameters );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> optimizer->SetMaximumStepLength( .1 ); // If this is set too high, you will get a<o:p></o:p></p><p class=MsoNormal> //"itk::ERROR: MeanSquaresImageToImageMetric(0xa27ce70): Too many samples map outside moving image buffer: 1818 / 10000" error<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> optimizer->SetMinimumStepLength( 0.01 );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Set a stopping criterion<o:p></o:p></p><p class=MsoNormal> optimizer->SetNumberOfIterations( 200 );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Connect an observer<o:p></o:p></p><p class=MsoNormal> //CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();<o:p></o:p></p><p class=MsoNormal> //optimizer->AddObserver( itk::IterationEvent(), observer );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> try<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal> registration->Update();<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> catch( itk::ExceptionObject & err )<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal> std::cerr << "ExceptionObject caught !" << std::endl;<o:p></o:p></p><p class=MsoNormal> std::cerr << err << std::endl;<o:p></o:p></p><p class=MsoNormal> return EXIT_FAILURE;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // The result of the registration process is an array of parameters that<o:p></o:p></p><p class=MsoNormal> // defines the spatial transformation in an unique way. This final result is<o:p></o:p></p><p class=MsoNormal> // obtained using the \code{GetLastTransformParameters()} method.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> ParametersType finalParameters = registration->GetLastTransformParameters();<o:p></o:p></p><p class=MsoNormal> std::cout << "Final parameters: " << finalParameters << std::endl;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> // The value of the image metric corresponding to the last set of parameters<o:p></o:p></p><p class=MsoNormal> // can be obtained with the \code{GetValue()} method of the optimizer.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> const double bestValue = optimizer->GetValue();<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // Print out results<o:p></o:p></p><p class=MsoNormal> //<o:p></o:p></p><p class=MsoNormal> std::cout << "Result = " << std::endl;<o:p></o:p></p><p class=MsoNormal> std::cout << " Metric value = " << bestValue << std::endl;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // It is common, as the last step of a registration task, to use the<o:p></o:p></p><p class=MsoNormal> // resulting transform to map the moving image into the fixed image space.<o:p></o:p></p><p class=MsoNormal> // This is easily done with the \doxygen{ResampleImageFilter}.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> typedef itk::ResampleImageFilter<<o:p></o:p></p><p class=MsoNormal> ImageType,<o:p></o:p></p><p class=MsoNormal> ImageType > ResampleFilterType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> ResampleFilterType::Pointer resampler = ResampleFilterType::New();<o:p></o:p></p><p class=MsoNormal> resampler->SetInput( movingImageReader->GetOutput());<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // The Transform that is produced as output of the Registration method is<o:p></o:p></p><p class=MsoNormal> // also passed as input to the resampling filter. Note the use of the<o:p></o:p></p><p class=MsoNormal> // methods \code{GetOutput()} and \code{Get()}. This combination is needed<o:p></o:p></p><p class=MsoNormal> // here because the registration method acts as a filter whose output is a<o:p></o:p></p><p class=MsoNormal> // transform decorated in the form of a \doxygen{DataObject}. For details in<o:p></o:p></p><p class=MsoNormal> // this construction you may want to read the documentation of the<o:p></o:p></p><p class=MsoNormal> // \doxygen{DataObjectDecorator}.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> resampler->SetTransform( registration->GetOutput()->Get() );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // As described in Section \ref{sec:ResampleImageFilter}, the<o:p></o:p></p><p class=MsoNormal> // ResampleImageFilter requires additional parameters to be specified, in<o:p></o:p></p><p class=MsoNormal> // particular, the spacing, origin and size of the output image. The default<o:p></o:p></p><p class=MsoNormal> // pixel value is also set to a distinct gray level in order to highlight<o:p></o:p></p><p class=MsoNormal> // the regions that are mapped outside of the moving image.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> resampler->SetSize( fixedImageReader->GetOutput()->GetLargestPossibleRegion().GetSize() );<o:p></o:p></p><p class=MsoNormal> resampler->SetOutputOrigin( fixedImageReader->GetOutput()->GetOrigin() );<o:p></o:p></p><p class=MsoNormal> resampler->SetOutputSpacing( fixedImageReader->GetOutput()->GetSpacing() );<o:p></o:p></p><p class=MsoNormal> resampler->SetOutputDirection( fixedImageReader->GetOutput()->GetDirection() );<o:p></o:p></p><p class=MsoNormal> resampler->SetDefaultPixelValue( 100 );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // The output of the filter is passed to a writer that will store the<o:p></o:p></p><p class=MsoNormal> // image in a file. An \doxygen{CastImageFilter} is used to convert the<o:p></o:p></p><p class=MsoNormal> // pixel type of the resampled image to the final type used by the<o:p></o:p></p><p class=MsoNormal> // writer. The cast and writer filters are instantiated below.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> typedef unsigned char OutputPixelType;<o:p></o:p></p><p class=MsoNormal> typedef itk::Image< OutputPixelType, Dimension > OutputImageType;<o:p></o:p></p><p class=MsoNormal> typedef itk::CastImageFilter<<o:p></o:p></p><p class=MsoNormal> ImageType,<o:p></o:p></p><p class=MsoNormal> ImageType > CastFilterType;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> WriterType::Pointer writer = WriterType::New();<o:p></o:p></p><p class=MsoNormal> CastFilterType::Pointer caster = CastFilterType::New();<o:p></o:p></p><p class=MsoNormal> writer->SetFileName("output.png");<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> caster->SetInput( resampler->GetOutput() );<o:p></o:p></p><p class=MsoNormal> writer->SetInput( caster->GetOutput() );<o:p></o:p></p><p class=MsoNormal> writer->Update();<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> return EXIT_SUCCESS;<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p></div></body></html>