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

Lucas Lorenzo lucas at cvrti.utah.edu
Tue, 24 Feb 2004 18:45:12 -0700


Hi Luis,

1) For C I use gcc-3.3and for C++ I use g++-3.3
2) Yes, I'm using Cmake
3) Yes, now I'm working on ITK1.6
	a) I've just copied the files itkFastMarchingImageFilter.h and  
itkFastMarchingImageFilter.txx from the cvs copy I checked out onto the  
directory where I had my previous code  
(---root/InsightToolkit-1.6.0/Code/Algorithms).
	b) Then, from the directory where I have the binaries  
(---root/Insight-binary) I run "make default_target_Code" and after  
that "make install_Code" .

Finally, as you suggested I tried replacing the declaraion of the  
FastMarching filter from:
>
>>> typedef itk::FastMarchingImageFilter<InternalImageType>  
>>> FastMarchingFilterType;
>>>
>>> with the following declaration:
>
>
> typedef itk::FastMarchingImageFilter<
>                        InternalImageType,
>                        InternalImageType>
>                              > FastMarchingFilterType;

but I still the same exception is been caught.

I hope this is helpful.


Lucas

On Feb 24, 2004, at 6:04 PM, Luis Ibanez wrote:

>
>
>
> 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,I 
>> nternalImageType> 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
>
>
>
>
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