Hello all,
I am trying to read a DTIbrain file in .vtk
format. The image has eigenvectors and eigenvalues attached to its voxels and I want to read and visualize the principal eigenvectors.
For this, I am using vtkStructuredPointsReader
as a reader and tried using vtkXMLPolyDataReader
which doesn’t work.
I am using Glyph3D to depict all the vectors as an arrow. I have tried the following codes and generated the image below:
the blueish section in the middle is where the brain is.
Now I want to get rid of the red arrows outside the brain and just to visualize the brain volume.
How do I do that?
Codes:
#include <vtkSmartPointer.h>
#include <vtkXMLPolyDataReader.h>
#include <vtkNrrdReader.h>
#include <vtkPolyData.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkStructuredPointsReader.h>
#include <vtkArrowSource.h>
#include <vtkGlyph3D.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyDataReader.h>
#include <vtkProperty.h>
#include <vtkImageDataGeometryFilter.h>
#include <vtkPolyDataNormals.h>
#include <vtkQuadricDecimation.h>
int main(int argc, char* argv[])
{
vtkSmartPointer<vtkStructuredPointsReader> reader = vtkSmartPointer<vtkStructuredPointsReader>::New();
//vtkSmartPointer<vtkXMLPolyDataReader> reader = vtkSmartPointer<vtkXMLPolyDataReader>::New();
//reader->SetFileName("../../PEoutput.vtk");
reader->SetFileName(argv[1]);
reader->Update();
vtkSmartPointer<vtkImageDataGeometryFilter>geometryFilter = vtkSmartPointer<vtkImageDataGeometryFilter>::New();
geometryFilter->SetInputConnection(reader->GetOutputPort());
geometryFilter->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(geometryFilter->GetOutputPort()); //geometryFilter
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(0, 0, 0);
// Compute & Visualize Normal Vectors
/*
vtkSmartPointer<vtkPolyDataNormals> normalsFilter = vtkSmartPointer<vtkPolyDataNormals>::New();
normalsFilter->SetInputData(geometryFilter->GetOutput());
normalsFilter->ComputePointNormalsOn();
normalsFilter->Update();
*/
vtkSmartPointer<vtkArrowSource>oneArrow = vtkSmartPointer<vtkArrowSource>::New();
oneArrow->Update();
vtkSmartPointer<vtkGlyph3D> lotsOfArrows = vtkSmartPointer<vtkGlyph3D>::New();
lotsOfArrows->SetSourceData(oneArrow->GetOutput());
lotsOfArrows->SetInputData(geometryFilter->GetOutput()); //gerometryFilter
lotsOfArrows->OrientOn();
lotsOfArrows->SetScaleFactor(1);
lotsOfArrows->SetColorModeToColorByVector();
lotsOfArrows->Update();
vtkSmartPointer < vtkPolyDataMapper > arrowMapper = vtkSmartPointer < vtkPolyDataMapper > ::New();
arrowMapper->SetInputData(lotsOfArrows->GetOutput());
vtkSmartPointer<vtkActor> arrowActor = vtkSmartPointer<vtkActor>::New();
arrowActor->SetMapper(arrowMapper);
arrowActor->GetProperty()->SetColor(1, 0, 0); //
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
renderer->AddActor(arrowActor); //arrowActor //actor
renderer->SetBackground(1, 1, 1);
renderWindow->Render();
renderWindow->SetSize(300, 300);
interactor->Start();
return 0;
}
I also tried reading the number of points and their attributes to threshold out outside arrows…but vtkStructuredPointsReader
seems to have no functions as GetNumberOfPoints
or GetAttributes
Please see the error image below: