[Insight-users] Help with GeodesicActiveContourImageFilter --> Modification to example code does not seem to work
Vimal Singh
vimal at mail.utexas.edu
Tue Feb 1 16:15:02 EST 2011
Hi all,
I'm a new User to ITK and have been learning it for past few days.
I managed to run the example codes and observe the same results
available in software guide document.
Currently I'm trying to develop my GeodesicActiveContourImageFilter,
which is similar to the one provided in the examples/segmentation folder
but does not use FastMarchingImageFilter for generation of initial Level
Set. Instead relies on user input for this initial level-set.
I've modified the example code accordingly and observed that the
DistanceMap obtained using DanielssonDistanceMapImageFilter matches
exactly the distance-map of initial level set generated by Example code.
However my final segmentation result is not the same, despite the
parameters for all other filters in two codes have been kept the same.
My complete code is below.
Can anyone give me hints as to what I might be missing. I've removed the
FastMarchingImageFilter all together. Any kind off help would be highly
appreciated !!! Or cite me an easier way to debug things ?
#include "itkImage.h"
#include "itkGeodesicActiveContourLevelSetImageFilter.h"
#include "itkCurvatureAnisotropicDiffusionImageFilter.h"
#include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"
#include "itkSigmoidImageFilter.h"
//#include "itkFastMarchingImageFilter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkBinaryThresholdImageFilter.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkDanielssonDistanceMapImageFilter.h" //Include for distance map
int main( int argc, char *argv[] )
{
if( argc < 10 )
{
std::cerr << "Missing Parameters " << std::endl;
std::cerr << "Usage: " << argv[0];
std::cerr << " inputImage initialLevelSet outputImage";
std::cerr << " Sigma SigmoidAlpha SigmoidBeta";
std::cerr << " CurvatureScaling AdvectionTerm PropagationScaling"
<< std::endl;
return 1;
}
std::cout << "Debug Point 1" << std::endl;
typedef float InternalPixelType;
const unsigned int Dimension = 2;
typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
typedef itk::BinaryThresholdImageFilter<
InternalImageType,
OutputImageType > ThresholdingFilterType;
ThresholdingFilterType::Pointer thresholder =
ThresholdingFilterType::New();
thresholder->SetLowerThreshold( -1000.0 );
thresholder->SetUpperThreshold( 0.0 );
thresholder->SetOutsideValue( 0 );
thresholder->SetInsideValue( 255 );
typedef itk::DanielssonDistanceMapImageFilter<
InternalImageType, InternalImageType >
DistanceMapFilterType;
DistanceMapFilterType::Pointer distanceMap =
DistanceMapFilterType::New(); //Instantiating the DistanceMap filter
std::cout << "Debug Point 3" << std::endl;
typedef itk::ImageFileReader< InternalImageType > ReaderType;
typedef itk::ImageFileWriter< OutputImageType > WriterType;
ReaderType::Pointer reader = ReaderType::New(); //reads image
ReaderType::Pointer reader2 = ReaderType::New(); //reads thresholded
initial level-set //reading the inital binary level-set image
WriterType::Pointer writer = WriterType::New();
reader->SetFileName( argv[1] );
reader2->SetFileName( argv[2] );
writer->SetFileName( argv[3] );
typedef itk::RescaleIntensityImageFilter<
InternalImageType,
OutputImageType > CastFilterType;
typedef itk::CurvatureAnisotropicDiffusionImageFilter<
InternalImageType,
InternalImageType > SmoothingFilterType;
SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();
typedef itk::GradientMagnitudeRecursiveGaussianImageFilter<
InternalImageType,
InternalImageType > GradientFilterType;
typedef itk::SigmoidImageFilter<
InternalImageType,
InternalImageType > SigmoidFilterType;
GradientFilterType::Pointer gradientMagnitude =
GradientFilterType::New();
SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();
sigmoid->SetOutputMinimum( 0.0 );
sigmoid->SetOutputMaximum( 1.0 );
typedef itk::GeodesicActiveContourLevelSetImageFilter<
InternalImageType,
InternalImageType > GeodesicActiveContourFilterType;
GeodesicActiveContourFilterType::Pointer geodesicActiveContour =
GeodesicActiveContourFilterType::New();
const double propagationScaling = atof( argv[9] );
const double curvatureScaling = atof( argv[7] );
const double advectionScaling = atof( argv[8] );
geodesicActiveContour->SetPropagationScaling( propagationScaling );
geodesicActiveContour->SetCurvatureScaling( curvatureScaling );
geodesicActiveContour->SetAdvectionScaling( advectionScaling );
std::cout << "Debug Point 7" << std::endl;
geodesicActiveContour->SetMaximumRMSError( 0.02 );
geodesicActiveContour->SetNumberOfIterations(800);
smoothing->SetInput( reader->GetOutput() );
gradientMagnitude->SetInput( smoothing->GetOutput() );
sigmoid->SetInput( gradientMagnitude->GetOutput() );
distanceMap->SetInput( reader2->GetOutput() );
geodesicActiveContour->SetInput( distanceMap->GetOutput() );
//our distance Mapped initial level-set
geodesicActiveContour->SetFeatureImage( sigmoid->GetOutput() );
thresholder->SetInput( geodesicActiveContour->GetOutput() );
writer->SetInput( thresholder->GetOutput() );
smoothing->SetTimeStep( 0.125 );
smoothing->SetNumberOfIterations( 5 );
smoothing->SetConductanceParameter( 9.0 );
std::cout << "Debug Point 9" << std::endl;
const double sigma = atof( argv[4] );
gradientMagnitude->SetSigma( sigma );
const double alpha = atof( argv[5] );
const double beta = atof( argv[6] );
sigmoid->SetAlpha( alpha );
sigmoid->SetBeta( beta );
std::cout << "Debug Point 9.1" << std::endl;
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();
std::cout << "Debug Point 9.15" << std::endl;
caster1->SetInput( smoothing->GetOutput() );
writer1->SetInput( caster1->GetOutput() );
writer1->SetFileName("myGeodesicActiveContourImageFilterOutput1.png");
caster1->SetOutputMinimum( 0 );
caster1->SetOutputMaximum( 255 );
writer1->Update();
std::cout << "Debug Point 9.2" << std::endl;
caster2->SetInput( gradientMagnitude->GetOutput() );
writer2->SetInput( caster2->GetOutput() );
writer2->SetFileName("myGeodesicActiveContourImageFilterOutput2.png");
caster2->SetOutputMinimum( 0 );
caster2->SetOutputMaximum( 255 );
writer2->Update();
std::cout << "Debug Point 9.3" << std::endl;
caster3->SetInput( sigmoid->GetOutput() );
writer3->SetInput( caster3->GetOutput() );
writer3->SetFileName("myGeodesicActiveContourImageFilterOutput3.png");
caster3->SetOutputMinimum( 0 );
caster3->SetOutputMaximum( 255 );
writer3->Update();
//caster4->SetInput( distanceMap->GetOutput() );
caster4->SetInput( geodesicActiveContour->GetInput());
writer4->SetInput( caster4->GetOutput() );
writer4->SetFileName("myGeodesicActiveContourImageFilterOutput4.png");
caster4->SetOutputMinimum( 0 );
caster4->SetOutputMaximum( 255 );
//writer4->Update();
std::cout << "Debug Point 10" << std::endl;
try
{
writer->Update();
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
}
// Print out some useful information
std::cout << std::endl;
std::cout << "Max. no. iterations: " <<
geodesicActiveContour->GetNumberOfIterations() << std::endl;
std::cout << "Max. RMS error: " <<
geodesicActiveContour->GetMaximumRMSError() << std::endl;
std::cout << std::endl;
std::cout << "No. elpased iterations: " <<
geodesicActiveContour->GetElapsedIterations() << std::endl;
std::cout << "RMS change: " << geodesicActiveContour->GetRMSChange()
<< std::endl;
writer4->Update();
return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20110201/b0d44a59/attachment.htm>
More information about the Insight-users
mailing list