[ITK-users] Symmetric Demons registration

stefano serviddio s.serviddio at gmail.com
Sun Sep 27 18:56:00 EDT 2015


Hi Matt,
I have added this code:
"
Image2->SetOrigin(Image1->GetOrigin());
  Image2->SetSpacing(Image1->GetSpacing());
  Image2->SetDirection(Image1->GetDirection());"
but the problem remain the same.

2015-09-28 0:10 GMT+02:00 Matt McCormick <matt.mccormick at kitware.com>:

> Hi Stefano,
>
> The means that the images must occupy the same spatial domain.  The
> domain is determined by the Origin, Spacing, Direction, and
> ImageRegion Size of the Image's.  This is explained more in the ITK
> Software Guide:
>
>
> http://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch4.html#x40-430004
>
> HTH,
> Matt
>
> On Sun, Sep 27, 2015 at 5:56 PM, stefano serviddio
> <s.serviddio at gmail.com> wrote:
> > HI,
> > I have always the same issue with my demons registration code, "Inputs do
> > not occupy the same physical space".
> >  the fixed image is a Ct  512x512 dicom and the second one is a Pet
> 256x256
> > dicom.
> > May you help me to find out what is the problem?
> > Thank you very much.
> >
> >
> >
> > #include "itkImageFileReader.h"
> > #include "itkImageFileWriter.h"
> > #include <time.h>
> > #include <fstream>
> > #include "itkSymmetricForcesDemonsRegistrationFilter.h"
> > #include "itkHistogramMatchingImageFilter.h"
> > #include "itkCastImageFilter.h"
> > #include "itkWarpImageFilter.h"
> >
> > #include "itkGDCMImageIO.h"
> > #include "itkShrinkImageFilter.h"
> >
> >
> >
> >   class CommandIterationUpdate : public itk::Command
> >   {
> >   public:
> >     typedef  CommandIterationUpdate                     Self;
> >     typedef  itk::Command                               Superclass;
> >     typedef  itk::SmartPointer<CommandIterationUpdate>  Pointer;
> >     itkNewMacro( CommandIterationUpdate );
> >   protected:
> >     CommandIterationUpdate() {};
> >
> >     typedef itk::Image< double, 2 >            InternalImageType;
> >     typedef itk::Vector< double, 2 >           VectorPixelType;
> >     typedef itk::Image<  VectorPixelType, 2 > DisplacementFieldType;
> >
> >     typedef itk::SymmetricForcesDemonsRegistrationFilter<
> >                                 InternalImageType,
> >                                 InternalImageType,
> >                                 DisplacementFieldType>
> > RegistrationFilterType;
> >
> >   public:
> >
> >     void Execute(itk::Object *caller, const itk::EventObject & event)
> > ITK_OVERRIDE
> >       {
> >         Execute( (const itk::Object *)caller, event);
> >       }
> >
> >     void Execute(const itk::Object * object, const itk::EventObject &
> event)
> > ITK_OVERRIDE
> >       {
> >          const RegistrationFilterType * filter = static_cast< const
> > RegistrationFilterType * >( object );
> >         if( !(itk::IterationEvent().CheckEvent( &event )) )
> >           {
> >           return;
> >           }
> >         std::cout << filter->GetMetric() << std::endl;
> >       }
> >   };
> >
> >
> > int main( int argc, char *argv[] )
> > {
> >   /*if( argc < 4 )
> >     {
> >     std::cerr << "Missing Parameters " << std::endl;
> >     std::cerr << "Usage: " << argv[0];
> >     std::cerr << " fixedImageFile movingImageFile ";
> >     std::cerr << " outputImageFile " << std::endl;
> >     std::cerr << " [outputDisplacementFieldFile] " << std::endl;
> >     return EXIT_FAILURE;
> >     }*/
> >
> >
> > time_t     now = time(0);
> >       struct tm  tstruct;
> >       char       buf[80];
> >       tstruct = *localtime(&now);
> >       strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
> >
> >      std::ofstream resultfile;
> >       char Risultati[] = "D:/Images/MetricResultDeformaion.txt";
> >
> >     resultfile.open(Risultati, std::ios::app);
> >     if (resultfile.is_open())
> >      {
> >         std::cout << "File Open exists\n";
> >
> >      }
> >
> > resultfile<<"Data :"<<buf<<std::endl;
> >
> >
> >
> >
> >   const unsigned int Dimension = 2;
> >   typedef unsigned int PixelType;
> >
> >   typedef itk::Image< PixelType, Dimension >  FixedImageType;
> >   typedef itk::Image< PixelType, Dimension >  MovingImageType;
> >
> >
> >
> >
> >   typedef itk::ImageFileReader< FixedImageType  > FixedImageReaderType;
> >   typedef itk::ImageFileReader< MovingImageType > MovingImageReaderType;
> >   typedef itk::GDCMImageIO GDCMType;
> >   GDCMType::Pointer gdcm=GDCMType::New();
> >   FixedImageReaderType::Pointer fixedImageReader   =
> > FixedImageReaderType::New();
> >   MovingImageReaderType::Pointer movingImageReader =
> > MovingImageReaderType::New();
> >
> >   char* filename1="D:/Images/def00001.dcm";
> >   char* filename2="D:/Images/def100001.dcm";
> >   fixedImageReader->SetFileName( filename1 );
> >   movingImageReader->SetFileName( filename2 );
> >   fixedImageReader->SetImageIO(gdcm);
> >   movingImageReader->SetImageIO(gdcm);
> >
> >   resultfile<<filename1<<std::endl;
> >   resultfile<<filename2<<std::endl;
> >
> >   fixedImageReader->Update();
> >   movingImageReader->Update();
> >
> >   typedef itk::ShrinkImageFilter<MovingImageType,MovingImageType>
> > ShrinkFilterType;
> > ShrinkFilterType::Pointer shrinkFilter = ShrinkFilterType::New();
> > shrinkFilter->SetShrinkFactors( 2 );
> > shrinkFilter->SetInput( fixedImageReader->GetOutput() );
> > shrinkFilter->Update();
> >
> >   typedef double                                      InternalPixelType;
> >   typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
> >   typedef itk::CastImageFilter< FixedImageType, InternalImageType >
> > FixedImageCasterType;
> >   typedef itk::CastImageFilter< MovingImageType, InternalImageType >
> > MovingImageCasterType;
> >
> >   FixedImageCasterType::Pointer fixedImageCaster =
> > FixedImageCasterType::New();
> >   MovingImageCasterType::Pointer movingImageCaster=
> > MovingImageCasterType::New();
> >
> >   fixedImageCaster->SetInput( shrinkFilter->GetOutput() );
> >   movingImageCaster->SetInput( fixedImageReader->GetOutput() );
> >
> >   fixedImageCaster->Update();
> >   movingImageCaster->Update();
> >
> >   typedef itk::HistogramMatchingImageFilter<
> > InternalImageType,InternalImageType >   MatchingFilterType;
> >   MatchingFilterType::Pointer matcher = MatchingFilterType::New();
> >
> >   matcher->SetInput( movingImageCaster->GetOutput() );
> >
> >   matcher->SetReferenceImage( fixedImageCaster->GetOutput() );
> >
> >
> >   matcher->SetNumberOfHistogramLevels(1024);
> >   matcher->SetNumberOfMatchPoints(7  );
> >
> >
> >   matcher->ThresholdAtMeanIntensityOn();
> >
> >   typedef itk::Vector< double, Dimension >           VectorPixelType;
> >   typedef itk::Image<  VectorPixelType, Dimension >
> DisplacementFieldType;
> >
> >
> >
> >  typedef
> >
> itk::SymmetricForcesDemonsRegistrationFilter<InternalImageType,InternalImageType,
> > DisplacementFieldType> RegistrationFilterType;
> >   RegistrationFilterType::Pointer filter = RegistrationFilterType::New();
> >
> >
> >
> >   CommandIterationUpdate::Pointer observer =
> CommandIterationUpdate::New();
> >   filter->AddObserver( itk::IterationEvent(), observer );
> >
> >
> >
> >   filter->SetFixedImage( fixedImageCaster->GetOutput() );
> >   filter->SetMovingImage( matcher->GetOutput());
> >   filter->SetNumberOfIterations( 256 );
> >   filter->SetStandardDeviations( 4.0 );
> >
> >
> >
> >   try
> > {
> > filter->Update();
> > }
> > catch( itk::ExceptionObject & err )
> > {
> > std::cerr << "ExceptionObject caught !" << std::endl;
> > std::cerr << err << std::endl;
> > return EXIT_FAILURE;
> > }
> >
> >
> >   typedef itk::WarpImageFilter<  MovingImageType, MovingImageType,
> > DisplacementFieldType  >     WarperType;
> >   typedef itk::LinearInterpolateImageFunction< MovingImageType,   double
> >
> > InterpolatorType;
> >   WarperType::Pointer warper = WarperType::New();
> >   InterpolatorType::Pointer interpolator = InterpolatorType::New();
> >   FixedImageType::Pointer fixedImage = fixedImageReader->GetOutput();
> >
> >   warper->SetInput( movingImageReader->GetOutput() );
> >   warper->SetInterpolator( interpolator );
> >   warper->SetOutputSpacing( fixedImage->GetSpacing() );
> >   warper->SetOutputOrigin( fixedImage->GetOrigin() );
> >   warper->SetOutputDirection( fixedImage->GetDirection() );
> >
> >   warper->SetDisplacementField( filter->GetOutput() );
> >
> >   warper->Update();
> >
> >
> >
> >   typedef  unsigned char                           OutputPixelType;
> >   typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
> >   typedef itk::CastImageFilter<
> >                         MovingImageType,
> >                         OutputImageType >          CastFilterType;
> >   typedef itk::ImageFileWriter< OutputImageType >  WriterType;
> >
> >   WriterType::Pointer      writer =  WriterType::New();
> >   CastFilterType::Pointer  caster =  CastFilterType::New();
> >
> >
> >
> >
> >
> >
> >
> >   std::cout<<"last metric value "<<filter->GetMetric()<<std::endl;
> >   resultfile<<"last metric value "<<filter->GetMetric()<<std::endl;
> >   writer->SetFileName( "D:/Images/new.dcm" );
> >
> >   caster->SetInput( warper->GetOutput() );
> >   caster->Update();
> >     writer->SetInput( caster->GetOutput()   );
> > writer->SetImageIO(gdcm);
> >   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://public.kitware.com/mailman/listinfo/insight-users
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20150928/95d4609d/attachment.html>


More information about the Insight-users mailing list