[ITK] [ITK-users] Symmetric Demons registration
Matt McCormick
matt.mccormick at kitware.com
Sun Sep 27 18:10:17 EDT 2015
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
>
_____________________________________
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
More information about the Community
mailing list