Please help me to read a series of tiff images and display them as volume or slices, to see what did I read using ITK, VTK. Following code doesn't work till the end. Only works to read all the images and forma connector but for display it does not work. What shall be done??
#include <vtkSmartPointer.h>
#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkTIFFReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include "vtkImageActor.h"
#include "vtkVersion.h"
#include "vtkImageViewer.h"
#include "vtkImageMapper3D.h"
#include "vtkInteractorStyleImage.h"
#include <vtkRenderer.h>
#include "itkImage.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"
#include "itkTIFFImageIO.h"
#include "itkImageSeriesReader.h"
#include "itkNumericSeriesFileNames.h"
#include "itkImageFileWriter.h"
#include "itkImageToVTKImageFilter.h"
int main(int argc, char* argv[])
{
// Verify the number of parameters in the command line
if (argc < 4)
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0]
<< " pattern firstSliceValue lastSliceValue"
<< std::endl;
return EXIT_FAILURE;
}
typedef unsigned short PixelType;
typedef itk::Image< PixelType, 3 > ImageStackType;
typedef itk::ImageSeriesReader< ImageStackType > ReaderType;
typedef itk::NumericSeriesFileNames NameGeneratorType;
const unsigned int first = atoi(argv[2]);
const unsigned int last = atoi(argv[3]);
//Generate Numerical File Names
NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
nameGenerator->SetSeriesFormat(argv[1]);
nameGenerator->SetStartIndex(first);
nameGenerator->SetEndIndex(last);
nameGenerator->SetIncrementIndex(1);
std::vector<std::string> names = nameGenerator->GetFileNames();
// List the files
//
std::vector<std::string>::iterator nit;
for (nit = names.begin();
nit != names.end();
nit++)
{
std::cout << "File: " << (*nit).c_str() << std::endl;
}
//Read Stack as TIFFs
ReaderType::Pointer stackReader = ReaderType::New();
stackReader->SetImageIO(itk::TIFFImageIO::New());
stackReader->SetFileNames(names);
stackReader->Update();
try
{
stackReader->Update();
}
catch (itk::ExceptionObject & err)
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
typedef itk::ImageToVTKImageFilter< ImageStackType > StackConnectorType;
ImageStackType::SizeType size = stackReader->GetOutput()- >GetBufferedRegion().GetSize();
int *extent = new int[6];
extent[0] = 0;
extent[1] = size[0];
extent[2] = 0;
extent[3] = size[1];
extent[4] = 0;
extent[5] = size[2];
//Export to VTK
StackConnectorType::Pointer stackConnector = StackConnectorType::New();
stackConnector->SetInput(stackReader->GetOutput());
stackConnector->Update();
stackConnector->GetOutput()->GetExtent(extent);
cout << "Size: " << extent[1] << "x" << extent[3] << "x" << extent[5] << endl;
// Visualize
vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputConnection(stackReader->GetOutputPort());
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
imageViewer->SetupInteractor(renderWindowInteractor);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
imageViewer->Render();
return EXIT_SUCCESS;
}
You were very close. The working code with slight modifications is below. BTW, you don't need to set ImageIO to TIFF if the images have .tif extension. I were giving the following command line parameters "./IMG%03d.png" 0 432
#include <vtkSmartPointer.h>
#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkTIFFReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include "vtkImageActor.h"
#include "vtkVersion.h"
#include "vtkImageViewer.h"
#include "vtkImageMapper3D.h"
#include "vtkInteractorStyleImage.h"
#include <vtkRenderer.h>
#include "itkImage.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"
#include "itkTIFFImageIO.h"
#include "itkImageSeriesReader.h"
#include "itkNumericSeriesFileNames.h"
#include "itkImageFileWriter.h"
#include "itkImageToVTKImageFilter.h"
int main(int argc, char* argv[])
{
// Verify the number of parameters in the command line
if (argc < 4)
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0]
<< " pattern firstSliceValue lastSliceValue"
<< std::endl;
return EXIT_FAILURE;
}
typedef unsigned short PixelType;
typedef itk::Image< PixelType, 3 > ImageStackType;
typedef itk::ImageSeriesReader< ImageStackType > ReaderType;
typedef itk::NumericSeriesFileNames NameGeneratorType;
const unsigned int first = atoi(argv[2]);
const unsigned int last = atoi(argv[3]);
//Generate Numerical File Names
NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
nameGenerator->SetSeriesFormat(argv[1]);
nameGenerator->SetStartIndex(first);
nameGenerator->SetEndIndex(last);
nameGenerator->SetIncrementIndex(1);
std::vector<std::string> names = nameGenerator->GetFileNames();
// List the files
//
std::vector<std::string>::iterator nit;
for (nit = names.begin();
nit != names.end();
nit++)
{
std::cout << "File: " << (*nit).c_str() << std::endl;
}
//Read Stack as TIFFs
ReaderType::Pointer stackReader = ReaderType::New();
//stackReader->SetImageIO(itk::TIFFImageIO::New());
stackReader->SetFileNames(names);
stackReader->Update();
try
{
stackReader->Update();
}
catch (itk::ExceptionObject & err)
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
typedef itk::ImageToVTKImageFilter< ImageStackType > StackConnectorType;
ImageStackType::SizeType size = stackReader->GetOutput()->GetBufferedRegion().GetSize();
int *extent = new int[6];
extent[0] = 0;
extent[1] = size[0];
extent[2] = 0;
extent[3] = size[1];
extent[4] = 0;
extent[5] = size[2];
//Export to VTK
StackConnectorType::Pointer stackConnector = StackConnectorType::New();
stackConnector->SetInput(stackReader->GetOutput());
stackConnector->Update();
stackConnector->GetOutput()->GetExtent(extent);
cout << "Size: " << extent[1] << "x" << extent[3] << "x" << extent[5] << endl;
// Visualize
vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputData(stackConnector->GetOutput());
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
imageViewer->SetupInteractor(renderWindowInteractor);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
//imageViewer->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}