[Insight-users] Error when run Affine Tranformation in Example Code.
David Doria
daviddoria at gmail.com
Fri Apr 5 07:41:25 EDT 2013
Why have you commented the lines that set the file names?
// movingWriter->SetFileName("moving.png");
David
David
On Thu, Apr 4, 2013 at 1:57 PM, Bui Toan <toanhoi at skku.edu> wrote:
> 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;****
>
> }****
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.php
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20130405/ba4f068c/attachment-0001.htm>
More information about the Insight-users
mailing list