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

Luis Ibanez luis.ibanez at kitware.com
Tue, 24 Feb 2004 20:04:50 -0500



Hi Lucas,


Thanks for posting the declaration of your types.


Could you please answer the following questions:


1) What compiler are you using ?

2) Are you using CMake for configuring your project ?

3) When you updated the source code, did you just
    take the new version of the FastMarching files
    or you updated the entire source tree ?
    I see that your directory is called ITK-1.6 ...



In addition to sending us the answers to these
questions, you can also try the following experiment:

   Replace the declaraion of the FastMarching filter from:

>> typedef itk::FastMarchingImageFilter<InternalImageType> 
>> FastMarchingFilterType;

    with the following declaration:


typedef itk::FastMarchingImageFilter<
                        InternalImageType,
                        InternalImageType>
                              > FastMarchingFilterType;


This shouldn't matter but...



Please let us know what you find,



   Thanks



       Luis



--------------------------
Lucas Lorenzo wrote:
> Hi Luis,
> 
> thanks for your answer.
> 
> My code has been taken from one testing file: 
> itkGeodesicActiveContourShapePriorLevelSetImageFilterTest_2.cxx
> 
> The typedefs are as follows:
> 
> / // 
> ********************************************************************* //
> /* Typedefs of components. */
> const unsigned int ImageDimension = 2;
> typedef unsigned short InputPixelType;
> typedef unsigned char BinaryPixelType;
> typedef double PCAPixelType;
> typedef float InternalPixelType;
> 
> typedef itk::Image<InputPixelType,ImageDimension> OriginalImageType;
> typedef itk::Image<PCAPixelType,ImageDimension> PCAImageType;
> typedef itk::Image<InternalPixelType,ImageDimension> InternalImageType;
> 
> 
> typedef 
> itk::GeodesicActiveContourShapePriorLevelSetImageFilter<InternalImageType,InternalImageType> 
> FilterType;
> typedef itk::PCAShapeSignedDistanceFunction<double,ImageDimension> 
> ShapeFunctionType;
> typedef 
> itk::ShapePriorMAPCostFunction<InternalImageType,InternalPixelType> 
> CostFunctionType;
> typedef itk::AmoebaOptimizer OptimizerType;
> typedef FilterType::ParametersType ParametersType;
> 
> //create a reader for the image to be segmented:
> typedef itk::ImageFileReader< OriginalImageType > OriginalReaderType;
> OriginalReaderType::Pointer original_reader = OriginalReaderType::New();
> // ********************************************************************* 
> ///
> 
> 
> The part of the code inherent to this class is the following one:
> 
> 
> / /**
> * Create an initial level.
> * Use fast marching to create an signed distance from a seed point.
> */
> typedef itk::FastMarchingImageFilter<InternalImageType> 
> FastMarchingFilterType;
> FastMarchingFilterType::Pointer fastMarching = 
> FastMarchingFilterType::New();
> 
> typedef FastMarchingFilterType::NodeContainer NodeContainer;
> typedef FastMarchingFilterType::NodeType NodeType;
> 
> NodeContainer::Pointer seeds = NodeContainer::New();
> 
> // The initial contour is a circle centered at {x_ini,y_ini} with radius
> // 2.0
> int x_ini = std::atoi(argv[4]);
> int y_ini = std::atoi(argv[5]);
> InternalImageType::IndexType seedPosition;
> seedPosition[0] = x_ini;
> seedPosition[1] = y_ini;
> 
> NodeType node;
> node.SetValue( -2.0 );
> node.SetIndex( seedPosition );
> 
> seeds->Initialize();
> seeds->InsertElement( 0, node );
> 
> fastMarching->SetTrialPoints( seeds );
> fastMarching->SetSpeedConstant( 1.0 );
> 
> OriginalImageType::RegionType inputRegion = 
> original_reader->GetOutput()->GetLargestPossibleRegion();
> OriginalImageType::SizeType imageSize = inputRegion.GetSize();
> fastMarching->SetOutputSize( imageSize );
> 
> try
> {
> fastMarching->Update();
> }
> catch( itk::ExceptionObject & exp )
> {
> std::cerr << "Exception caught ! fastMarching" << std::endl;
> std::cerr << exp << std::endl;
> return -1;
> }
> /
> 
> typedef itk::ImageFileWriter< InternalImageType > FMWriterType;
> FMWriterType::Pointer FM_writer = FMWriterType::New();
> FM_writer->SetFileName("fast_marching.vtk");
> FM_writer->SetInput(fastMarching->GetOutput());
> FM_writer->Update();
> 
> 
> 
> What is strange to me is that with the old version of 
> /itk::FastMarchingImageFilter/ (the one I was using before checking out 
> the cvs copy) I could run the program with the only problem of the 
> spacing mentioned in the first email.
> 
> Sorry if this is confusing but I'm trying to make it as clear as possible.
> Thanks,
> 
> 
> Lucas
> 
> On Feb 24, 2004, at 1:22 PM, Luis Ibanez wrote:
> 
> 
>     Hi Lucas,
> 
>     This exception indicates that the object you
>     are connecting is not actually an image.
>     The CopyInformation() method perform a dynamic_cast
>     from a DataObject pointer into an ImageBase pointer.
> 
>     dynamic_casting throws exceptions when the pointer
>     is not actually the type that you are trying to
>     convert to.
> 
>     Can you please post the typedef declarations that
>     your are using for:
> 
>     1) The input image type of the Fast Marching filter
>     2) The output image type of the Fast Marching filter
>     3) The Fast Marcnhing filter itself
> 
> 
>     The current tests of the FastMarching filter
>     are passing fine on all platforms. Including
>     the Examples in Insight/Examples/Segmentation.
> 
> 
>     Thanks
> 
> 
>     Luis
> 
> 
> 
>     --------------------
>     Lucas Lorenzo wrote:
> 
>         Hi Luis and Lydia,
>         I've just checked out a CVS copy so I'm using the last version
>         of FastMarchingImageFilter.
>         When doing an Update on this filter I'm catching this exception:
>         /Exception caught ! fastMarching
>         itk::ExceptionObject (0x11021d0)
>         Location: "Unknown"
>         File: /bin/ITK-1.6.0/include/InsightToolkit/Common/itkImageBase.txx
>         Line: 159
>         Description: itk::ERROR: Image(0x1101f00):
>         itk::ImageBase::CopyInformation() cannot cast
>         PKN3itk10DataObjectE to PN3itk9ImageBaseILj2EEE
>         /
>         Could you please give me some feed back on this ?
>         Thanks,
>         Lucas
>         On Feb 19, 2004, at 12:05 AM, Luis Ibanez wrote:
>         Hi Lucas,
>         The changes to the FastMarchingImageFilter have
>         been commited. The output image now uses the
>         spacing and origin of the input image.
>         Please let us know if you find any problem.
>         Thanks
>         Luis
>         ------------------------
>         Lucas Lorenzo wrote:
>         Hi Luis,
>         sorry for answering so late.
>         I've tried what you suggested but I have a run time error "Abort
>         trap" when trying to apply the GetOutput() method to my
>         FastMarchingImageFilter object.
>         Let me know if there are any other changes we could try.
>         Thanks,
>         Lucas
>         On Feb 11, 2004, at 5:58 AM, Luis Ibanez wrote:
>         Hi Lucas,
>         Thanks for pointing this out.
>         Please try the following:
>         Edit the file:
>         Insight/Code/Algorithms/
>         itkFastMarchingImageFilter.txx
>         Go to to line : 150
>         and after the statement
>         output->Allocate();
>         add
>         output->CopyInformation( this->GetInput() );
>         Then, go to line : 157
>         and after the statement
>         m_LabelImage->Allocate();
>         add
>         m_LabelImage->CopyInformation( this->GetInput() );
>         This should copy the origin and spacing
>         of the input image into the output and
>         label images.
>         Then recompile your application and try
>         running it to see if the correct spacing
>         appears in the file.
>         Please let us know what you find, so we proceed
>         to do the same changes in the repository.
>         Thanks
>         Luis
>         ----------------------
>         Lucas Lorenzo wrote:
>         Hi Luis,
>         sorry for having such a mess in my code.
>         I'm using an application based on
>         ITK/Testing/Code/Algorithms/
> 
>         itkGeodesicActiveContourShapePriorLevelSetImageFilterTest_2.cxx
>         The spacing is being carried through the pipeline with
>         no problem, except when arriving to the point when I
>         have to generate my initial contour (signed distance
>         map) from a seed point using FastMarchingImageFilter. It
>         is the output from this filter the one that has the
>         "default" spacing (and I think that this new spacing is
>         carried to the end to the output image) and I can't find
>         any method to set the correct spacing.
>         Thanks,
>         Lucas
>         On Tuesday, February 10, 2004, at 08:38 PM, Luis Ibanez
>         wrote:
>         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
>         _______________________________________________
>         Insight-users mailing list
>         Insight-users at itk.org
>         http://www.itk.org/mailman/listinfo/insight-users
>         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
>         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
>         _______________________________________________
>         Insight-users mailing list
>         Insight-users at itk.org
>         http://www.itk.org/mailman/listinfo/insight-users
>         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
> 
> 
> 
> 
> 
> 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
>