[vtkusers] Save Registration Deformation field in ITK and display in VTK glyph

Luis Ibanez luis.ibanez at kitware.com
Sun Dec 31 09:52:48 EST 2006



Hi Wei,

Here are a couple of options:


A: Have you tried using the vtkImageReader ?
    instead of using the vtkStructuredPointsReader.



B: Enjoy Open Source: you could modify the itkVTKImageIO.cxx
    file in line 481 in order to write out "VECTORS" instead
    of "SCALARS". You probably want to do this with code such
    as:


     if( this->GetPixeltype() == ImageIOBase::VECTOR )
       {
       file << "SCALARS scalars";
       }
     else
       {
       file << "VECTORS vectors";
       }
    file << this->GetComponentTypeAsString( m_ComponentType)...



"B" is probably a better option. Please give it a try
and let us know if we should make the changes in the
CVS repository.



    Thanks


       Luis


-------------------
Wei Xiong wrote:
> Hi ITKers and VTKers,
> 
>    I have some problems in saving and displaying registration 
> deformation field in VTK format.
> 
> The code in ITK is
> 
>    typedef itk::Vector< float, Dimension >    VectorPixelType;
>    typedef itk::Image< VectorPixelType, Dimension > DeformationFieldType;
>    typedef itk::ImageFileWriter< DeformationFieldType > FieldWriterType;
>    FieldWriterType::Pointer fieldWriter = FieldWriterType::New();
>    fieldWriter->SetFileName( "field.vtk" );
>    fieldWriter->SetInput( nrreg->GetDeformationField() );
>    fieldWriter->Update();
> 
> The code in VTK is
> 
>   vtkStructuredPointsReader *fieldReader = vtkStructuredPointsReader::New();
>   fieldReader->SetFileName( "field.vtk" );
>   vtkArrowSource *arrow = vtkArrowSource::New();
>   vtkMaskPoints *masker = vtkMaskPoints::New();
>   masker->SetOnRatio( 1000 );
>   masker->RandomModeOn();
>   masker->SetInputConnection( fieldReader->GetOutputPort() );
>   vtkGlyph3D *glyph = vtkGlyph3D::New();
>   glyph->SetInputConnection( masker->GetOutputPort() );
>   glyph->SetScaleModeToScaleByVector();
>   glyph->SetColorModeToColorByVector();  
>   glyph->OrientOn();
>   glyph->SetVectorModeToUseVector();
>   glyph->SetSourceConnection( arrow->GetOutputPort() );
>   vtkPolyDataMapper *glyphmapper = vtkPolyDataMapper::New();
>   glyphmapper->SetInputConnection(glyph->GetOutputPort());
>   vtkActor *glyphactor = vtkActor::New();
> 
> Displaying in VTK results in all arrows just pointing to one direction, 
> say along X-axis.
> I found this is because ITK save field data in VTK using Data Attribute 
> in the header:
> 
> SCALARS scalars float 3
> LOOKUP_TABLE default
> 
> If I manually change it to:
> 
> VECTORS vectors float
> 
> Then, glyphs are displayed correctly.
> 
> I also tried to use itkVTKImageIO to correct this behavior using the code:
> 
> typedef itk::VTKImageIO  VTKImageIOType;
> VTKImageIOType::Pointer vtkIO = VTKImageIOType::New();
> vtkIO->SetComponentType( VTKImageIOType::FLOAT );
> vtkIO->SetPixelType( VTKImageIOType::VECTOR );
> fieldWriter->SetImageIO( vtkIO );
> 
> ITK just saves in the same way. Don't work.
> 
> Can I change the behavior of ITK or is there any filter in VTK can 
> correct this?
> Anyone has some ideas on this.
> 
> Thank you very much!
> Mengda
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> This is the private VTK discussion list. 
> Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers



More information about the vtkusers mailing list