[Insight-users] setting the spacing when writing an image to disk

Luis Ibanez luis.ibanez at kitware.com
Tue, 10 Feb 2004 22:38:15 -0500


Hi Lucas,

Why are you setting the spacing on the ImageIO
object instead of the image itself ?

You should just carry the spacing through the
pipeline. Does your input image has an invalid
spacing ?

An option in that case is to use the
ChangeInformationImageFilter
http://www.itk.org/Insight/Doxygen/html/classitk_1_1ChangeInformationImageFilter.html

This filter carries the data buffer of the
input image to the output image, and allows
you to alter the meta-data such as image
origin and spacing.

Please don't use this filter for processing
images of human beings or any other living
organisms, since chances are that you will
make somebody operate in a liver instead of
a lung.


In the long term the right thing to do is
to fix the source of your images which is
where the real spacing information should
be comming from.


Regards,


   Luis



======================================
-------------------
Lucas Lorenzo wrote:

> Hi all,
> 
> I'm trying to write an image to disk in vtk format.
> By default the spacing is set to 1 1 1. I'd like to change it so I'm 
> doing the following:
> 
> /#include "itkVTKImageIO.h"
> 
> int main( int argc, char * argv[] )
> {
> 
> /* /* Typedefs of components. */*/
> const unsigned int ImageDimension = 2;
> typedef unsigned char BinaryPixelType;
> typedef itk::Image<BinaryPixelType,ImageDimension> BinaryImageType;
> 
> 
> /*// read the input image and get the spacing from it:*/
> 
> typedef itk::VTKImageIO ImageIOType;
> ImageIOType::Pointer IO1 = ImageIOType::New();
> original_reader->SetImageIO(IO1);
> double dx,dy,dz;
> original_reader->Update();
> dx = IO1->GetSpacing(0);
> dy = IO1->GetSpacing(1);
> dz = IO1->GetSpacing(2);
> 
> /*// here I'm omitting when I process the input image
> 
> // write the image to a file but perviously set the spacing
> */
> binary_writer->SetFileName("out.vtk");
> 
> 
> binary_writer->SetInput(thresholder->GetOutput());
> 
> ImageIOType::Pointer IO2 = ImageIOType::New();
> IO2->SetSpacing(0,dx);
> IO2->SetSpacing(1,dy);
> IO2->SetSpacing(2,dz);
> binary_writer->SetImageIO(IO2);
> 
> try
> {
> binary_writer->Update();
> }
> catch( itk::ExceptionObject & exp )
> {
> std::cerr << "Exception caught ! binary image writer" << std::endl;
> std::cerr << exp << std::endl;
> return -1;
> }
> 
> 
> return 0;
> }
> /
> When I execute this program I have a "segmentation fault" run time error.
> If I ommit the line setting the spacing in the z axis ("/ 
> IO2->SetSpacing(2,dz); /") the programs executes without crashing but 
> the spacing is not really set, that is, in the header of the output vtk 
> file (out.vtk) you can still see "SPACING 1 1 1.0" instead of "SPACING 
> dx dy 1.0".
> Any clue of what am I doing wrong ?
> Thanks,
> 
> Lucas Lorenzo
> 
> University of Utah
> Nora Eccles Harrison CardioVascular Research and Training Institute
> Fellows Room
> 95 South 2000 East
> Salt Lake City, UT 84112-5000
> 
> e-mail: lucas at cvrti.utah.edu
> telephone: 801-587-9536
>