[Insight-users] Demons Registration- Warping Field Parameters

Luis Ibanez luis.ibanez at kitware.com
Sun, 04 Apr 2004 16:32:26 -0400


Hi Rahul,

You could simply connect the output of the
DemonsRegistrationFilter as input to the
ImageFileWriter, taking care of instanciating
the writer over a vector image.

You can save Vector images in files by using
VTK or MetaImage formats.

Adding writing capabilities to a filter breaks
the natural division of labor in the toolkit.
It is better to delegate writing to the ImageIO
framework which is designed for this specific
purpose.

Please let us know if you find any further
difficulties.

    Thanks


      Luis


---------------------
Rahul Chander wrote:

> Hi,
> I was looking for a method in Demons Registration Filter that will 
> allow me to export the final deformation field to an image file.  
> This feature is implemented for FEM based deformable registration 
> through member: WriteDisplacementField().  
> Unable to find anything similar, I looked at the code for 
> WriteDisplacementField() available in 
> Code/Algorithms/itkFEMRegistrationFilter.txx  and wrote up something 
> similar. 
> I inserted the following for Demons Registration (2D) in 
> Examples/Registration/DeformableRegistration2.cxx and got some 
> results.  Can anyone confirm if this approach will give the correct 
> results?  Is there a better way?
> 
> Thanks.
> Rahul. 
> ...
> #include <itkVectorIndexSelectionCastImageFilter.h>
> ....
> ...
>   writer->SetFileName( argv[3] );
>   caster->SetInput( warper->GetOutput() );
>   writer->SetInput( caster->GetOutput()   );
>   writer->Update();
> 
> //My code begins here. 
> //Commented lines are for expanding to the 3D case.
> 
> 	typedef itk::Image< float, Dimension > FloatImageType;
> 	typedef 
> itk::VectorIndexSelectionCastImageFilter<DeformationFieldType,FloatImageType> 
> IndexSelectCasterType;
> 	IndexSelectCasterType::Pointer fieldCaster1 = 
> IndexSelectCasterType::New();
> 	IndexSelectCasterType::Pointer fieldCaster2 = 
> IndexSelectCasterType::New();
> //	IndexSelectCasterType::Pointer fieldCaster3 = 
> IndexSelectCasterType::New();
> 
> 	fieldCaster1->SetInput( warper->GetDeformationField() );
> 	fieldCaster1->SetIndex( 0 );
> 	fieldCaster2->SetInput(warper->GetDeformationField() );
> 	fieldCaster2->SetIndex( 1 );
> //	fieldCaster3->SetInput(warper->GetDeformationField() );
> //	fieldCaster3->SetIndex( 2 );
> 
> 	// Define the output of the Moving
> 	fieldCaster1->Update();
> 	fieldCaster2->Update();
> //	fieldCaster3->Update();
> 
> 	typedef itk::ImageFileWriter<FloatImageType> WriterTypeFloat;
> 	WriterTypeFloat::Pointer writer1 = WriterTypeFloat::New();
> 	WriterTypeFloat::Pointer writer2 = WriterTypeFloat::New();
> //	WriterTypeFloat::Pointer writer3 = WriterTypeFloat::New();
> 
> 	// Set up the output filename
> 	std::string outfile1="X_disp_vec.hdr";
> 	std::string outfile2="Y_disp_vec.hdr";
> //	std::string outfile3="Z_disp_vec.hdr";
> 	std::cout << "Writing displacements to " << outfile1;
> 	writer1->SetInput(fieldCaster1->GetOutput());
> 	writer1->SetFileName(outfile1.c_str());
> 	writer1->Write();
> 	std::cout << "...done" << std::endl;
> 
> 	std::cout << "Writing displacements to " << outfile2;
> 	writer2->SetInput(fieldCaster2->GetOutput());
> 	writer2->SetFileName(outfile2.c_str());
> 	writer2->Write();
> 	std::cout << "...done" << std::endl;
> 
> // 	std::cout << "Writing displacements to " << outfile3;
> // 	writer3->SetInput(fieldCaster3->GetOutput());
> // 	writer3->SetFileName(outfile3.c_str());
> // 	writer3->Write();
> // 	std::cout << "...done" << std::endl;
> 
> 
> The cout statements above do not function the way they are supposed 
> to because of the threaded nature of the code, and therefore they 
> are not very useful to have in main().  
>