Search code examples
image3dvtkitk

New TO ITK,VTK. Reading tiff files and dipslaying them either as a volume or 3D slices. Error


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;
}

enter image description here


Solution

  • 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;
    }