[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
>