[vtkusers] correction of spacing

Cory Quammen cquammen at cs.unc.edu
Mon Nov 24 19:24:41 EST 2008


I believe using vtkImageChangeInformation is the correct way to propagate
changes of image spacing in a pipeline. See
http://www.vtk.org/doc/nightly/html/classvtkImageChangeInformation.html. If
you just update the output of the reader, your changes will be overwritten
when the object downstream from the reader requests data.

Plug a vtkImageChangeInformation object into your pipeline right after your
reader. It'll look something like:

vtkImageChangeInformation *changer = vtkImageChangeInformation::New();
changer->SetOutputSpacing(xSpacing, ySpacing, zSpacing);
changer->SetInputConnection(reader->GetOutputPort());
...
 vtkImageReslice *reslice = vtkImageReslice::New();
 reslice->SetInputConnection(changer->GetOutputPort());

Hope that helps,
Cory

On Mon, Nov 24, 2008 at 5:58 PM, Bartosz Wiklak <bwiklak at gmail.com> wrote:

> Ok, I did it, and then:
>
> vtkImageReslice *reslice = vtkImageReslice::New();
>
>  reslice->SetInput(image);
>
>  reslice->SetOutputDimensionality(2);
>
>  reslice->SetResliceAxes(resliceAxes);
>
>  reslice->SetInterpolationModeToNearestNeighbor();
>
> Still my resulting image is stretched.
>
> (almost) the whole code:
>
>  vtkGDCMImageReader *reader = vtkGDCMImageReader::New();
>
>
>
>        std::vector<std::string> filenames;
>
>
>
>        gdcm::Directory d;
>
>
>
>        d.Load( "/home/basiek/Dokumenty/dcms/testGLOWA/1", false );
>
>
>
>        filenames = d.GetFilenames();
>
>        gdcm::IPPSorter s;
>
>        s.SetComputeZSpacing( true );
>
>        s.SetZSpacingTolerance( 1e-2 );
>
>        bool b = s.Sort( filenames );
>
>        if( !b )
>
>                {
>
>                std::cerr << "Failed to sort:" << "s" << std::endl;
>
>                return 1;
>
>                }
>
>
>
>        std::cout << "Sorting succeeded:" << s.GetZSpacing() << std::endl;
>
>        //s.Print( std::cout );
>
>
>
>        const std::vector<std::string> & sorted = s.GetFilenames();
>
>
>
>        vtkStringArray *files = vtkStringArray::New();
>
>        std::vector< std::string >::const_iterator it = sorted.begin();
>
>        for( ; it != sorted.end(); ++it)
>
>        {
>
>        const std::string &f = *it;
>
>        files->InsertNextValue( f.c_str() );
>
>        }
>
>        reader->SetFileNames( files );
>
>        reader->Update();
>
>
>
>
>
>
>
>   // Calculate the center of the volume
>
>  reader->GetOutput()->UpdateInformation();
>
>  int extent[6];
>
>  double spacing[3];
>
>  double origin[3];
>
>  reader->GetOutput()->GetWholeExtent(extent);
>
>  reader->GetOutput()->GetSpacing(spacing);
>
>  reader->GetOutput()->GetOrigin(origin);
>
>
>
>  spacing[2] = 1.5;
>
>
>
>  vtkImageData* image = reader->GetOutput();
>
>  image->SetSpacing(spacing);
>
>
>
>
>
> std::cout << "Sorting succeeded:" << spacing[2] << std::endl;
>
>
>
>  double center[3];
>
>  center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
>
>  center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
>
>  center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);
>
>
>
>  // Matrices for axial, coronal, sagittal, oblique view orientations
>
>  static double axialElements[16] = {
>
>           1, 0, 0, 0,
>
>           0, 1, 0, 0,
>
>           0, 0, 1, 0,
>
>           0, 0, 0, 1 };
>
>
>
>  static double coronalElements[16] = {
>
>           1, 0, 0, 0,
>
>           0, 0, 1, 0,
>
>           0,-1, 0, 0,
>
>           0, 0, 0, 1 };
>
>
>
>  static double sagittalElements[16] = {
>
>           0, 0,-1, 0,
>
>           1, 0, 0, 0,
>
>           0,-1, 0, 0,
>
>           0, 0, 0, 1 };
>
>
>
>  //static double obliqueElements[16] = {
>
>  //         1, 0, 0, 0,
>
>  //         0, 0.866025, -0.5, 0,
>
>  //         0, 0.5, 0.866025, 0,
>
>  //         0, 0, 0, 1 };
>
>
>
>  // Set the slice orientation
>
>  vtkMatrix4x4 *resliceAxes = vtkMatrix4x4::New();
>
>  resliceAxes->DeepCopy(coronalElements);
>
>  // Set the point through which to slice
>
>  resliceAxes->SetElement(0, 3, center[0]);
>
>  resliceAxes->SetElement(1, 3, center[1]);
>
>  resliceAxes->SetElement(2, 3, center[2]);
>
>
>
>  // Extract a slice in the desired orientation
>
>  vtkImageReslice *reslice = vtkImageReslice::New();
>
>  reslice->SetInput(image);
>
>  reslice->SetOutputDimensionality(2);
>
>  reslice->SetResliceAxes(resliceAxes);
>
>  reslice->SetInterpolationModeToNearestNeighbor();
>
>
>
>  // Create a greyscale lookup table
>
>  vtkLookupTable *table = vtkLookupTable::New();
>
>  table->SetRange(0, 200); // image intensity range
>
>  table->SetValueRange(0.0, 1.0); // from black to white
>
>  table->SetSaturationRange(0.0, 0.0); // no color saturation
>
>  table->SetRampToLinear();
>
>  table->Build();
>
>
>
>  // Map the image through the lookup table
>
>  vtkImageMapToColors *color = vtkImageMapToColors::New();
>
>  color->SetLookupTable(table);
>
>  color->SetInputConnection(reslice->GetOutputPort());
>
>
>
>  // Display the image
>
>  vtkImageActor *actor = vtkImageActor::New();
>
>  actor->SetInput(color->GetOutput());
>
>
>
>        // The line definition
>
>        vtkLineSource *seeds = vtkLineSource::New();
>
>        seeds->SetPoint1(0.0,0.0,0.0);
>
>        seeds->SetPoint2(0.0,50.0,0.0);
>
>        seeds->SetResolution(20);
>
>
>
>        // The Line Mapper
>
>        vtkPolyDataMapper *seedsMapper = vtkPolyDataMapper::New();
>
>        seedsMapper->SetInputConnection(seeds->GetOutputPort());
>
>
>
>        // The line Actor
>
>        vtkActor *seedsActor = vtkActor::New();
>
>        seedsActor->SetMapper(seedsMapper);
>
>        seedsActor->GetProperty()->SetColor(1.0,1.0,1.0);
>
>        seedsActor->GetProperty()->SetRepresentationToPoints();
>
>        seedsActor->GetProperty()->SetOpacity(0.95);
>
>
>
>
>
>  vtkRenderer *renderer = vtkRenderer::New();
>
>  renderer->AddActor(actor);
>
>  renderer->AddActor(seedsActor);
>
>
>
>  vtkRenderWindow *window = vtkRenderWindow::New();
>
>  window->AddRenderer(renderer);
>
>
>
>  // Set up the interaction
>
>  vtkInteractorStyleImage *imageStyle = vtkInteractorStyleImage::New();
>
>  vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New();
>
>  interactor->SetInteractorStyle(imageStyle);
>
>  window->SetInteractor(interactor);
>
>  window->Render();
>
>
>
>  vtkImageInteractionCallback *callback =
> vtkImageInteractionCallback::New();
>
>  callback->SetImageReslice(reslice);
>
>  callback->SetInteractor(interactor);
>
>
>
>  imageStyle->AddObserver(vtkCommand::MouseMoveEvent, callback);
>
>  imageStyle->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
>
>  imageStyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);
>
>
>
>  // Start interaction
>
>  // The Start() method doesn't return until the window is closed by the
> user
>
>  interactor->Start();
>
>
>
>  // Clean up
> ...
>
> What is wrong with it?
>
>
>
> On Mon, Nov 24, 2008 at 11:49 PM, Dominik Szczerba <dominik at itis.ethz.ch>
> wrote:
> > you need something like:
> >
> > vtkImageData* image = reader->GetOutput();
> > image->SetSpacing(spacing);
> > // check with image->GetSpacing(spacing);
> >
> > Dominik
> >
> > Bartosz Wiklak wrote:
> >>
> >> Oh, I'm really NEW to VTK (2 weeks of heavy learning and some attempts
> >> before), so please be more specific.
> >> Why should I get mesh out, ist't it the same?:
> >>
> >> reader->GetOutput()->SetSpacing(...)
> >>
> >>> mesh = reader->GetOutput();
> >>> mesh->SetSpacing(...)
> >>
> >> ?
> >>
> >> What I should do further?
> >>
> >> Really thanks for kind help.
> >>
> >> On Mon, Nov 24, 2008 at 11:37 PM, Dominik Szczerba <
> dominik at itis.ethz.ch>
> >> wrote:
> >>>
> >>> Fist of all get the mesh out of the reader:
> >>>
> >>> mesh = reader->GetOutput();
> >>> mesh->SetSpacing(...)
> >>>
> >>> Dominik
> >>>
> >>> Bartosz Wiklak wrote:
> >>>>
> >>>> Hi, thanks for answear
> >>>>
> >>>> If I understand, you suggested to use reader->Update() or
> >>>> reader->GetOutput()->Update().
> >>>> It doesn't work for me, I still can see that spacing is wrong.
> >>>>
> >>>> I'm not sure, but after some actions UpdateInformation is called
> >>>> automatically.
> >>>> Sample code:
> >>>>
> >>>>  spacing[2] = 1.5;
> >>>>
> >>>>  reader->GetOutput()->SetSpacing(spacing);
> >>>>
> >>>>  reader->Update();
> >>>>
> >>>>  reader->GetOutput()->UpdateInformation();
> >>>>
> >>>>  reader->GetOutput()->GetSpacing(spacing);
> >>>>
> >>>>
> >>>> or
> >>>>
> >>>>  spacing[2] = 1.5;
> >>>>
> >>>>  reader->GetOutput()->SetSpacing(spacing);
> >>>>
> >>>>  reader->GetOutput()->Update();
> >>>>
> >>>>  reader->GetOutput()->UpdateInformation();
> >>>>
> >>>>  reader->GetOutput()->GetSpacing(spacing);
> >>>>
> >>>> Gives me spacing[2]==1.0
> >>>>
> >>>>
> >>>> What can I do?
> >>>>
> >>>> Bartek
> >>>>
> >>>>
> >>>> On Mon, Nov 24, 2008 at 7:58 PM, Dominik Szczerba <
> dominik at itis.ethz.ch>
> >>>> wrote:
> >>>>>
> >>>>> Haha! - see my recent posts.
> >>>>> Try updating the pipeline with the correct spacing.
> >>>>>
> >>>>> Dominik
> >>>>>
> >>>>> Bartosz Wiklak wrote:
> >>>>>>
> >>>>>> Hello,
> >>>>>>
> >>>>>> I'm using GDCM  ( vtkGDCMImageReader ) to read some MR data.
> >>>>>> I switched  SetComputeZSpacing on, set SetZSpacingTolerance to 1e-2
> >>>>>> and used IPPSorter.
> >>>>>> This is my code:
> >>>>>>
> >>>>>>  vtkGDCMImageReader *reader = vtkGDCMImageReader::New();
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>      std::vector<std::string> filenames;
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>      gdcm::Directory d;
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>      d.Load( "/home/basiek/Dokumenty/dcms/testGLOWA/1", false );
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>      filenames = d.GetFilenames();
> >>>>>>
> >>>>>>      gdcm::IPPSorter s;
> >>>>>>
> >>>>>>      s.SetComputeZSpacing( true );
> >>>>>>
> >>>>>>      s.SetZSpacingTolerance( 1e-2 );
> >>>>>>
> >>>>>>      bool b = s.Sort( filenames );
> >>>>>>
> >>>>>>      if( !b )
> >>>>>>
> >>>>>>              {
> >>>>>>
> >>>>>>              std::cerr << "Failed to sort:" << "s" << std::endl;
> >>>>>>
> >>>>>>              return 1;
> >>>>>>
> >>>>>>              }
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>      std::cout << "Sorting succeeded:" << s.GetZSpacing() <<
> >>>>>> std::endl;
> >>>>>>
> >>>>>>      //s.Print( std::cout );
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>      const std::vector<std::string> & sorted = s.GetFilenames();
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>      vtkStringArray *files = vtkStringArray::New();
> >>>>>>
> >>>>>>      std::vector< std::string >::const_iterator it = sorted.begin();
> >>>>>>
> >>>>>>      for( ; it != sorted.end(); ++it)
> >>>>>>
> >>>>>>      {
> >>>>>>
> >>>>>>      const std::string &f = *it;
> >>>>>>
> >>>>>>      files->InsertNextValue( f.c_str() );
> >>>>>>
> >>>>>>      }
> >>>>>>
> >>>>>>      reader->SetFileNames( files );
> >>>>>>
> >>>>>>      reader->Update();
> >>>>>>
> >>>>>> I'm getting zspacing 1.5 whitch is ok, but in the
> >>>>>> reader->GetOutput()->GetSpacing(spacing) I'm getiing spacing[2]==1.0
> !
> >>>>>>
> >>>>>> What am I doing wrong?
> >>>>>> I tried to set pixelspacing manually but after
> >>>>>> reader->GetOutput()->UpdateInformation() I'm with old, wrong value
> >>>>>> again.
> >>>>>>
> >>>>>> When I make reslice in coronal I have eyes shaped like ellipses. I
> >>>>>> tired to set pixelspacing for vtkImageReslice:
> >>>>>> reslice->SetOutputSpacing( spacing[0], spacing[1], 1.5 );
> >>>>>>
> >>>>>> but this also makes no difference regardless
> >>>>>> reslice->GetOutput()->UpdateInformation().
> >>>>>>
> >>>>>> Can someone point me in the right direction?
> >>>>>> _______________________________________________
> >>>>>> 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
> >>>>>>
> >>>>> --
> >>>>> Dominik Szczerba, PhD
> >>>>> Computational Physics Group
> >>>>> IT'IS Foundation
> >>>>> http://www.itis.ethz.ch
> >>>>>
> >>> --
> >>> Dominik Szczerba, PhD
> >>> Computational Physics Group
> >>> IT'IS Foundation
> >>> http://www.itis.ethz.ch
> >>>
> >>
> >
> > --
> > Dominik Szczerba, PhD
> > Computational Physics Group
> > IT'IS Foundation
> > http://www.itis.ethz.ch
> >
> _______________________________________________
> 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
>



-- 
Cory Quammen
Center for Computer Integrated Systems for Microscopy and Manipulation
(CISMM)
Department of Computer Science
University of North Carolina at Chapel Hill
http://www.cs.unc.edu/~cquammen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20081124/a1002ae2/attachment.htm>


More information about the vtkusers mailing list