[Insight-users] Error when run Affine Tranformation in Example Code.
Bui Toan
toanhoi at skku.edu
Thu Apr 4 13:57:16 EDT 2013
Hello everybody,
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:
terminate called after throwing an instance of 'itk::ExceptionObject'
what(): /usr/local/include/ITK-4.4/itkImageFileWriter.hxx:123:
itk::ERROR: ImageFileWriter(0x9808fd8): No filename was specified
Aborted (core dumped)
This is my editing code. Please help me edit it. I am using ITK version
newest 4.3.1 for Linux
#include "itkCastImageFilter.h"
#include "itkEllipseSpatialObject.h"
#include "itkImage.h"
#include "itkImageRegistrationMethod.h"
#include "itkLinearInterpolateImageFunction.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkMeanSquaresImageToImageMetric.h"
#include "itkRegularStepGradientDescentOptimizer.h"
#include "itkResampleImageFilter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkSpatialObjectToImageFilter.h"
#include "itkAffineTransform.h"
#include "itkGDCMImageIO.h"
// Software Guide : EndCodeSnippet
#include <list>
#include <fstream>
const unsigned int Dimension = 2;
typedef unsigned char PixelType;
typedef itk::Image< PixelType, Dimension > ImageType;
static void CreateEllipseImage(ImageType::Pointer image);
static void CreateSphereImage(ImageType::Pointer image);
int main(int, char *[] )
{
// The transform that will map the fixed image into the moving image.
typedef itk::AffineTransform< double, Dimension > TransformType;
// An optimizer is required to explore the parameter space of the
transform
// in search of optimal values of the metric.
typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
// The metric will compare how well the two images match each other.
Metric
// types are usually parameterized by the image types as it can be seen
in
// the following type declaration.
typedef itk::MeanSquaresImageToImageMetric<
ImageType,
ImageType > MetricType;
// Finally, the type of the interpolator is declared. The interpolator
will
// evaluate the intensities of the moving image at non-grid positions.
typedef itk:: LinearInterpolateImageFunction<
ImageType,
double > InterpolatorType;
// The registration method type is instantiated using the types of the
// fixed and moving images. This class is responsible for interconnecting
// all the components that we have described so far.
typedef itk::ImageRegistrationMethod<
ImageType,
ImageType > RegistrationType;
// Create components
MetricType::Pointer metric = MetricType::New();
TransformType::Pointer transform = TransformType::New();
OptimizerType::Pointer optimizer = OptimizerType::New();
InterpolatorType::Pointer interpolator = InterpolatorType::New();
RegistrationType::Pointer registration = RegistrationType::New();
// Each component is now connected to the instance of the registration
method.
registration->SetMetric( metric );
registration->SetOptimizer( optimizer );
registration->SetTransform( transform );
registration->SetInterpolator( interpolator );
// Write the two synthetic inputs
typedef itk::Image< PixelType, Dimension > FixedImageType;
typedef itk::Image< PixelType, Dimension > MovingImageType;
// Software Guide : EndCodeSnippet
// Set up the file readers
typedef itk::ImageFileReader< FixedImageType > FixedImageReaderType;
typedef itk::ImageFileReader< MovingImageType > MovingImageReaderType;
FixedImageReaderType::Pointer fixedImageReader =
FixedImageReaderType::New();
MovingImageReaderType::Pointer movingImageReader =
MovingImageReaderType::New();
fixedImageReader->SetFileName("fix.dcm" );
movingImageReader->SetFileName( "mov.dcm" );
typedef itk::ImageFileWriter< ImageType > WriterType;
WriterType::Pointer fixedWriter = WriterType::New();
//ixedWriter->SetFileName("fixed.png");
fixedWriter->SetInput( fixedImageReader->GetOutput());
fixedWriter->Update();
WriterType::Pointer movingWriter = WriterType::New();
// movingWriter->SetFileName("moving.png");
movingWriter->SetInput( movingImageReader->GetOutput());
movingWriter->Update();
// Set the registration inputs
registration->SetFixedImage(fixedImageReader->GetOutput());
registration->SetMovingImage(movingImageReader->GetOutput());
registration->SetFixedImageRegion(
fixedImageReader->GetOutput()->GetLargestPossibleRegion() );
// Initialize the transform
typedef RegistrationType::ParametersType ParametersType;
ParametersType initialParameters( transform->GetNumberOfParameters() );
// rotation matrix
initialParameters[0] = 1.0; // R(0,0)
initialParameters[1] = 0.0; // R(0,1)
initialParameters[2] = 0.0; // R(1,0)
initialParameters[3] = 1.0; // R(1,1)
// translation vector
initialParameters[4] = 0.0;
initialParameters[5] = 0.0;
registration->SetInitialTransformParameters( initialParameters );
optimizer->SetMaximumStepLength( .1 ); // If this is set too high, you
will get a
//"itk::ERROR: MeanSquaresImageToImageMetric(0xa27ce70): Too many samples
map outside moving image buffer: 1818 / 10000" error
optimizer->SetMinimumStepLength( 0.01 );
// Set a stopping criterion
optimizer->SetNumberOfIterations( 200 );
// Connect an observer
//CommandIterationUpdate::Pointer observer =
CommandIterationUpdate::New();
//optimizer->AddObserver( itk::IterationEvent(), observer );
try
{
registration->Update();
}
catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
// The result of the registration process is an array of parameters that
// defines the spatial transformation in an unique way. This final result
is
// obtained using the \code{GetLastTransformParameters()} method.
ParametersType finalParameters =
registration->GetLastTransformParameters();
std::cout << "Final parameters: " << finalParameters << std::endl;
// The value of the image metric corresponding to the last set of
parameters
// can be obtained with the \code{GetValue()} method of the optimizer.
const double bestValue = optimizer->GetValue();
// Print out results
//
std::cout << "Result = " << std::endl;
std::cout << " Metric value = " << bestValue << std::endl;
// It is common, as the last step of a registration task, to use the
// resulting transform to map the moving image into the fixed image
space.
// This is easily done with the \doxygen{ResampleImageFilter}.
typedef itk::ResampleImageFilter<
ImageType,
ImageType > ResampleFilterType;
ResampleFilterType::Pointer resampler = ResampleFilterType::New();
resampler->SetInput( movingImageReader->GetOutput());
// The Transform that is produced as output of the Registration method is
// also passed as input to the resampling filter. Note the use of the
// methods \code{GetOutput()} and \code{Get()}. This combination is
needed
// here because the registration method acts as a filter whose output is
a
// transform decorated in the form of a \doxygen{DataObject}. For details
in
// this construction you may want to read the documentation of the
// \doxygen{DataObjectDecorator}.
resampler->SetTransform( registration->GetOutput()->Get() );
// As described in Section \ref{sec:ResampleImageFilter}, the
// ResampleImageFilter requires additional parameters to be specified, in
// particular, the spacing, origin and size of the output image. The
default
// pixel value is also set to a distinct gray level in order to highlight
// the regions that are mapped outside of the moving image.
resampler->SetSize(
fixedImageReader->GetOutput()->GetLargestPossibleRegion().GetSize() );
resampler->SetOutputOrigin( fixedImageReader->GetOutput()->GetOrigin() );
resampler->SetOutputSpacing( fixedImageReader->GetOutput()->GetSpacing()
);
resampler->SetOutputDirection(
fixedImageReader->GetOutput()->GetDirection() );
resampler->SetDefaultPixelValue( 100 );
// The output of the filter is passed to a writer that will store the
// image in a file. An \doxygen{CastImageFilter} is used to convert the
// pixel type of the resampled image to the final type used by the
// writer. The cast and writer filters are instantiated below.
typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
typedef itk::CastImageFilter<
ImageType,
ImageType > CastFilterType;
WriterType::Pointer writer = WriterType::New();
CastFilterType::Pointer caster = CastFilterType::New();
writer->SetFileName("output.png");
caster->SetInput( resampler->GetOutput() );
writer->SetInput( caster->GetOutput() );
writer->Update();
return EXIT_SUCCESS;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20130405/ae889b72/attachment.htm>
More information about the Insight-users
mailing list