[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