[Insight-users] ITK FastMarching example--help!!!--the resultion of output images are changed to [1 1 1]

Baoyun Li baoyun_li123 at yahoo.com
Wed Feb 25 14:10:59 EST 2009


Hello: Lui,

I rebuild the ITK as you suggested. Now the image resulution is correct.

Thanks a lot.

Baoyun




________________________________
From: Luis Ibanez <luis.ibanez at kitware.com>
To: Baoyun Li <baoyun_li123 at yahoo.com>
Cc: insight-users at itk.org
Sent: Wednesday, February 25, 2009 11:11:30 AM
Subject: Re: ITK FastMarching example--help!!!--the resultion of output images are changed to [1 1 1]


Hi Baoyun,

Yes ITK 3.10 is the release where this bug sneaked in.  :-(

You can fix it by yourself by applying the following change:

http://public.kitware.com/cgi-bin/viewcvs.cgi/Code/BasicFilters/itkGradientMagnitudeRecursiveGaussianImageFilter.txx?root=Insight&r1=1.20&r2=1.21&sortby=date


Simply add:

   cumulativeImage->CopyInformation(this->GetInput());

to line 216 of the file

    Insight/Code/BasicFilters/
         itkGradientMagnitudeRecursiveGaussianImageFilter.txx

and rebuild your application.

--

The great advantage of Open Source software is indeed
that you *can* help yourself and help others by fixing 
things on your own.     :-)


Please let us know if you find any problem,

   Thanks

       Luis


------------------------------------------------------------------------

On Wed, Feb 25, 2009 at 11:52 AM, Baoyun Li <baoyun_li123 at yahoo.com> wrote:

Dear Luis:

The ITK version I used 3..10.0. I begin to used it at the end of 2008. Do you think that will be a problem?

I will try CVS version  or the new relase, and let you know the result.

Is it possible for myself to fix the problem? Or I have to be very familiar with ITK to solve the problem by myself. You know the later work can not be continues once this kind of thing happend.

Thanks and my best regards
Baoyun





________________________________
From: Luis Ibanez <luis.ibanez at kitware.com>
To: Baoyun Li <baoyun_li123 at yahoo.com>
Cc: insight-users at itk.org
Sent: Wednesday, February 25, 2009 10:43:43 AM
Subject: Re: ITK FastMarching example--help!!!--the resultion of output images are changed to [1 1 1]



Hi Baoyun,

What version of ITK are you using ?

In a recent release a bug went into the RecursiveGaussianImageFilter, 
that resulted in the spacing information being reset to trivial values.

This has now been fixed in the CVS repository.

Could you please try a CVS checkout of ITK ?

FYI: We will be releasing ITK 3.12 by Monday.

Please let us know what you find,


      Thanks


           Luis


-----------------------------------------

On Wed, Feb 25, 2009 at 11:39 AM, Baoyun Li <baoyun_li123 at yahoo.com> wrote:

Dear All:

When I run ITK example for fastmarching (see the attached code below), the output image resolution are changed to [1 1 1] begining at sigmoid filter output [writer3->SetFileName("../data/FastMarchingFilterOutput3.hdr")]. But my input resolution is [0.7 0.7 2.5]. The first two output files kept the origianl resolution.

I only changed some arguments of  the expmale code and the Dimension to 3. My command aruguments are: FastMarchingImageFilter SE1.hdr out.hdr 1000 1001.

ITK deals images on Physical space, now the spacial resolution of images are changed, so I do not how I can trust the results and cannot continue some works, eg mutiple resoltion processing

Can somebody help me to figure out this problem?  Thanks a lot.


Best regards

Baoyun


#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#ifdef __BORLANDC__
#define ITK_LEAN_AND_MEAN
#endif


#include "itkCurvatureAnisotropicDiffusionImageFilter.h"
#include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"
#include "itkSigmoidImageFilter.h"
#include "itkImage.h"
#include "itkFastMarchingImageFilter.h"

// Software Guide : BeginCodeSnippet
#include "itkBinaryThresholdImageFilter.h"

// Software Guide : BeginCodeSnippet
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
// 
#include "itkRescaleIntensityImageFilter.h"

int main( int argc, char *argv[] )
{
  if( argc < 3 )
    {
    std::cerr << "Missing Parameters " << std::endl;
    std::cerr << "Usage: " << argv[0];
    std::cerr << " inputImage  outputImage seedX seedY";
    std::cerr << " Sigma SigmoidAlpha SigmoidBeta TimeThreshold StoppingValue" << std::endl;
    return 1;
    }

  
  // Software Guide : BeginCodeSnippet
  typedef   float           InternalPixelType;
  const     unsigned int    Dimension = 3;
  typedef itk::Image< InternalPixelType, Dimension >  InternalImageType;
  // Software Guide : EndCodeSnippet
  typedef unsigned char OutputPixelType;
  typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
  // Software Guide : EndCodeSnippet
  typedef itk::BinaryThresholdImageFilter< InternalImageType, 
                        OutputImageType    >    ThresholdingFilterType;
  ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();
  
  const InternalPixelType  timeThreshold = atof( argv[3] );
  
  // Software Guide : BeginCodeSnippet
  thresholder->SetLowerThreshold(           0.0  );
  thresholder->SetUpperThreshold( timeThreshold  );
  thresholder->SetOutsideValue(  0  );
  thresholder->SetInsideValue(  255 );
  
  // Software Guide : BeginCodeSnippet
  typedef  itk::ImageFileReader< InternalImageType > ReaderType;
  typedef  itk::ImageFileWriter<  OutputImageType  > WriterType;
  // Software Guide : EndCodeSnippet

  ReaderType::Pointer reader = ReaderType::New();
  WriterType::Pointer writer = WriterType::New();
  reader->SetFileName( argv[1] );
  writer->SetFileName( argv[2] );

  //  The RescaleIntensityImageFilter type is declared below. This filter will
  //  renormalize image before sending them to writers.
  //
  typedef itk::RescaleIntensityImageFilter< 
                               InternalImageType, 
                               OutputImageType >   CastFilterType;
  typedef   itk::CurvatureAnisotropicDiffusionImageFilter< 
                               InternalImageType, 
                               InternalImageType >  SmoothingFilterType;
  
  // Software Guide : BeginCodeSnippet
  SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();
 
  // Software Guide : BeginCodeSnippet
  typedef   itk::GradientMagnitudeRecursiveGaussianImageFilter< 
                               InternalImageType, 
                               InternalImageType >  GradientFilterType;
  typedef   itk::SigmoidImageFilter<                               
                               InternalImageType, 
                               InternalImageType >  SigmoidFilterType;
  
  GradientFilterType::Pointer  gradientMagnitude = GradientFilterType::New();
  SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();
  // Software Guide : EndCodeSnippet

  // Software Guide : BeginCodeSnippet
  sigmoid->SetOutputMinimum(  0.0  );
  sigmoid->SetOutputMaximum(  1.0  );
  
  // Software Guide : BeginCodeSnippet
  typedef  itk::FastMarchingImageFilter< InternalImageType, 
                              InternalImageType >    FastMarchingFilterType;
  
  // Software Guide : BeginCodeSnippet
  FastMarchingFilterType::Pointer  fastMarching = FastMarchingFilterType::New();
 
  // Software Guide : BeginCodeSnippet
  smoothing->SetInput( reader->GetOutput() );
  gradientMagnitude->SetInput( smoothing->GetOutput() );
  sigmoid->SetInput( gradientMagnitude->GetOutput() );
  fastMarching->SetInput( sigmoid->GetOutput() );
  thresholder->SetInput( fastMarching->GetOutput() );
  writer->SetInput( thresholder->GetOutput() );
  // Software Guide : EndCodeSnippet

  
  // Software Guide : BeginCodeSnippet
  smoothing->SetTimeStep( 0.05 );
  smoothing->SetNumberOfIterations(  10 );
  smoothing->SetConductanceParameter( 9.0 );
  // Software Guide : EndCodeSnippet

  
  const double sigma = (float) 2.5;//atof( argv[5] );
  // Software Guide : BeginCodeSnippet
  gradientMagnitude->SetSigma(  sigma  );
  // Software Guide : EndCodeSnippet

  const double alpha =  (float)-0.33;//atof( argv[6] );
  const double beta  =  (float) 0.5;//atof( argv[7] );

  // Software Guide : BeginCodeSnippet
  sigmoid->SetAlpha( alpha );
  sigmoid->SetBeta(  beta  );
 
 
  typedef FastMarchingFilterType::NodeContainer           NodeContainer;
  typedef FastMarchingFilterType::NodeType                NodeType;
  NodeContainer::Pointer seeds = NodeContainer::New();
  //  Software Guide : EndCodeSnippet 
  
  InternalImageType::IndexType  seedPosition;
  
  seedPosition[0] = 131;//atoi( argv[3] );
  seedPosition[1] = 273;//atoi( argv[4] );
  seedPosition[2] = 36;//atoi( argv[4] );

  
  NodeType node;
  const double seedValue = 0.0;
  
  node.SetValue( seedValue );
  node.SetIndex( seedPosition );
 
  seeds->Initialize();
  seeds->InsertElement( 0, node );
  //  Software Guide : EndCodeSnippet 
  // Software Guide : BeginCodeSnippet
  fastMarching->SetTrialPoints(  seeds  );
  // Software Guide : EndCodeSnippet

  //  Here we configure all the writers required to see the intermediate
  //  outputs of the pipeline. This is added here only for
  //  pedagogical/debugging purposes. These intermediate output are normaly not
  //  required. Only the output of the final thresholding filter should be
  //  relevant.  Observing intermediate output is helpful in the process of
  //  fine tuning the parameters of filters in the pipeline. 
  //
  CastFilterType::Pointer caster1 = CastFilterType::New();
  CastFilterType::Pointer caster2 = CastFilterType::New();
  CastFilterType::Pointer caster3 = CastFilterType::New();
  CastFilterType::Pointer caster4 = CastFilterType::New();
  WriterType::Pointer writer1 = WriterType::New();
  WriterType::Pointer writer2 = WriterType::New();
  WriterType::Pointer writer3 = WriterType::New();
  WriterType::Pointer writer4 = WriterType::New();
  caster1->SetInput( smoothing->GetOutput() );
  writer1->SetInput( caster1->GetOutput() );
  writer1->SetFileName("../data/FastMarchingFilterOutput1..hdr");
  caster1->SetOutputMinimum(   0 );
  caster1->SetOutputMaximum( 255 );
  writer1->Update();
  caster2->SetInput( gradientMagnitude->GetOutput() );
  writer2->SetInput( caster2->GetOutput() );
  writer2->SetFileName(".../data/FastMarchingFilterOutput2.hdr");
  caster2->SetOutputMinimum(   0 );
  caster2->SetOutputMaximum( 255 );
  writer2->Update();
  caster3->SetInput( sigmoid->GetOutput() );
  writer3->SetInput( caster3->GetOutput() );
  writer3->SetFileName("../data/FastMarchingFilterOutput3.hdr");
  caster3->SetOutputMinimum(   0 );
  caster3->SetOutputMaximum( 255 );
  writer3->Update();
  caster4->SetInput( fastMarching->GetOutput() );
  writer4->SetInput( caster4->GetOutput() );
  writer4->SetFileName("../data/FastMarchingFilterOutput4.hdr");
  caster4->SetOutputMinimum(   0 );
  caster4->SetOutputMaximum( 255 );

  //  Software Guide : BeginLatex
 
  //
  //  Software Guide : EndLatex 
  // Software Guide : BeginCodeSnippet
  fastMarching->SetOutputSize( 
           reader->GetOutput()->GetBufferedRegion().GetSize() );
  // Software Guide : EndCodeSnippet

  
  //
  //  Software Guide : EndLatex 
  const double stoppingTime = atof( argv[4] );
  // Software Guide : BeginCodeSnippet
  fastMarching->SetStoppingValue(  stoppingTime  );
  // Software Guide : EndCodeSnippet

 
  // Software Guide : BeginCodeSnippet
  try
    {
    writer->Update();
    }
  catch( itk::ExceptionObject & excep )
    {
    std::cerr << "Exception caught !" << std::endl;
    std::cerr << excep << std::endl;
    }
  // Software Guide : EndCodeSnippet

  writer4->Update();

  // The following writer type is used to save the output of the
  // time-crossing map in a file with appropiate pixel representation. The
  // advantage of saving this image in native format is that it can be used
  // with a viewer to help determine an appropriate threshold to be used on
  // the output of the \code{fastmarching} filter.
  //
  typedef itk::ImageFileWriter< InternalImageType > InternalWriterType;
  InternalWriterType::Pointer mapWriter = InternalWriterType::New();
  mapWriter->SetInput( fastMarching->GetOutput() );
  mapWriter->SetFileName("../data/FastMarchingFilterOutput5.hdr");
  mapWriter->Update();
  InternalWriterType::Pointer speedWriter = InternalWriterType::New();
  speedWriter->SetInput( sigmoid->GetOutput() );
  speedWriter->SetFileName("../data/FastMarchingFilterOutput6.hdr");
  speedWriter->Update();
  InternalWriterType::Pointer gradientWriter = InternalWriterType::New();
  gradientWriter->SetInput( gradientMagnitude->GetOutput() );
  gradientWriter->SetFileName("../data/FastMarchingFilterOutput7.hdr");
  gradientWriter->Update();

  return 0;
}


      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20090225/71aeb874/attachment-0001.htm>


More information about the Insight-users mailing list