[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