[Insight-users] converting from vtk to itk and back again

Mark Roden mmroden at gmail.com
Tue Sep 20 00:59:30 EDT 2011


Hi all,

I've looked on google and the various newsgroups and have not found
the answer to what I thought was a pretty straightforward question.

I have a vtkImageData object that has been obtained... somehow.  I do
not have the pipeline at this point, just the output.  The user could
have done any number of things to have arrived at this point, and so I
store a vtkImageData that has been DeepCopied off of the end of
whatever pipeline was employed.

I then want to save that image in the Analyze format.  A coworker made
his own reader/writer using the information that Mayo put out, but the
resulting files don't appear to be oriented correctly.  I want to
verify if his version is producing a bug, and I wanted to use the itk
version of the writing plugin to do the work.

Here's what I have:

#ifdef ITK_IMG_WRITER
#include "vtkImageExport.h"
#include <itkVTKImageImport.h>
#include "itkImageFileWriter.h"
#include "itkAnalyzeImageIO.h"
#include "itkImage.h"
#include "itkOrientedImage.h"
#endif


void saveAnalyzeImage(vtkImageData * const image, const QString &file) {

#ifdef ITK_IMG_WRITER
    //this code is done using ITK, and so requires that ITK be included
    typedef itk::OrientedImage< signed short, 3 > CTImage;
    typedef itk::ImageFileWriter< CTImage> CTWriter;
    typedef itk::VTKImageImport<CTImage> VTKImageImportType;

    CTWriter::Pointer theWriter = CTWriter::New();

    theWriter->SetFileName(file.toStdString().c_str());

    vtkImageExport* theExporter = vtkImageExport::New();
    theExporter->SetInput(image);

    VTKImageImportType::Pointer vtkImageToImageFilter =
VTKImageImportType::New();
    theExporter->SetOutput(vtkImageToImageFilter);
    vtkImageToImageFilter->Update();

    theWriter->SetInput(vtkImageToImageFilter->GetOutput());

    itk::AnalyzeImageIO::Pointer analyzeIO = itk::AnalyzeImageIO::New();
    theWriter->SetImageIO(analyzeIO);

    try {
        theWriter->Update();
    } catch(itk::ExceptionObject ex){
        return; //do something else here for error handling
    }
    theWriter->Delete();
    vtkImageToImageFilter->Delete();
    analyzeIO->Delete();
    return;

#else
    //do the other code instead
#endif
}

This code is not compiling, because
theExporter->SetOutput(vtkImageToImageFilter) doesn't work.  I've also
tried just using the VTKImageImportType object directly, but that does
not have a SetInput method.  As could be guessed from the code, I also
tried vtkImageToImageFilter, but that appears to be a deprecated
leftover from 2004 or so.  Unless there's some include file I'm not
finding?

All I really want is for vtk to read and write analyze files.  Barring
that, I want to be able to seamlessly convert from a vtkImageData
object to an itk::Image object so I can use itk's analyze export and
importing functions.  How can I fix that code to make it work?

Thanks,
Mark


More information about the Insight-users mailing list