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

Luis Ibanez luis.ibanez at kitware.com
Mon Jan 15 12:08:35 EST 2007


Menda, Wei, Simon,

The changes have been committed in itkVTKImageIO.

Now image of type


    itk::Image< itk::Vector< T,D >, D >


Will be written in VTK files using the "VECTORS vector"
string.


  Please let us know if you find any problems,


    Thanks


      Luis


--------------------
Mengda Wu wrote:
> Hi Luis,
> 
>    Yes. Option B will work, but need small modifications:
> 
>   Replace Line 481-484 with:
> 
>   if( this->GetPixelType() == ImageIOBase::VECTOR )
>   {
>     file << "VECTORS vectors "
>       << this->GetComponentTypeAsString(m_ComponentType) << "\n";
>   }
>   else
>   {
>     file << "SCALARS scalars "
>       << this->GetComponentTypeAsString(m_ComponentType) << " "
>       << this->GetNumberOfComponents() << "\n";
>     file << "LOOKUP_TABLE default\n";
>   }
> 
> I also find vtkAssignAttribute in VTK can overcome this problem without 
> modifying ITK. Filter the data with before Glyph:
> 
> vtkAssignAttribute *assigner = vtkAssignAttribute::New();
> assigner->Assign( vtkDataSetAttributes::SCALARS, 
> vtkDataSetAttributes::VECTORS, vtkAssignAttribute::POINT_DATA);
> 
> Therefore, I think it is OK without modifying ITK.
> 
> Guanglei
> 
> 2006/12/31, Luis Ibanez <luis.ibanez at kitware.com 
> <mailto:luis.ibanez at kitware.com>>:
> 
> 
> 
>     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