[Insight-users] I am learning active contour algorithm , there is problem about itkGeodesicActiveContourLevelSetImageFilter
zhq
15891495523 at 126.com
Sun Aug 11 04:40:36 EDT 2013
Hello , Dear:
I am learning itkGeodesicActiveContourLevelSetImageFilter , and I can segment a 2 dimension picture . And , now , I am trying to segment a 3 dimension data . But , when I segment a 2 dimension picture , it costs me about one minute . But , it costs me more than 20 minutes to segment a 3 dimension data , the data consists in 4 two-dimensional pictures . Is my code wrong ?
#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 "itkGDCMImageIO.h"
#include "itkJPEGImageIO.h"
#include "itkChangeInformationImageFilter.h"
#include "itkImage.h"
#include "itkImageSeriesReader.h"
#include "itkNumericSeriesFileNames.h"
#include "itkImageFileWriter.h"
int main()
{
typedef float InternalPixelType;
const unsigned int Dimension = 3;
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( -80.0 );
thresholder->SetUpperThreshold( 2 );
thresholder->SetOutsideValue( 0 );
thresholder->SetInsideValue( 255 );
// ************* reader ****************************** //
// typedef itk::ImageFileReader< InternalImageType > ReaderType;
// ReaderType::Pointer reader = ReaderType::New();
// reader->SetFileName("C:\\Users\\zhq\\Desktop\\VolumeData.vtk");
// reader->SetFileName("C:\\Users\\zhq\\Desktop\\BrainProtonDensitySlice.png");
// reader->SetImageIO(itk::GDCMImageIO::New());
// reader->SetFileName("C:\\Users\\zhq\\Desktop\\data\\SNAP_CR\\E403434298\\E403434298S1901I301.dcm");
// reader->SetImageIO(itk::JPEGImageIO::New());
// reader->SetFileName("C:\\Users\\zhq\\Desktop\\data\\picture8\\1.jpeg");
// reader->SetFileName("C:\\Users\\zhq\\Desktop\\\\1.jpg");
typedef itk::ImageSeriesReader<InternalImageType> ReaderType ;
ReaderType::Pointer reader = ReaderType::New();
typedef itk::NumericSeriesFileNames NameGeneratorType ;
NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
nameGenerator->SetSeriesFormat("C:\\Users\\zhq\\Desktop\\data\\SNAP_CR\\E403434298\\E403434298S1901I%3d.dcm");
nameGenerator->SetStartIndex(301);
nameGenerator->SetEndIndex(304);
nameGenerator->SetIncrementIndex(1);
reader->SetImageIO(itk::GDCMImageIO::New());
reader->SetFileNames(nameGenerator->GetFileNames());
reader->Update();
std::cout<<"reader update"<<std::endl;
// ************* finish reader ********************** //
// ************* writer ******************************* //
typedef itk::ImageFileWriter< OutputImageType > WriterType;
WriterType::Pointer writer = WriterType::New();
writer->SetFileName("C:\\Users\\zhq\\Desktop\\ActiveContour.vtk");
// ************* finish writer ********************** //
typedef itk::RescaleIntensityImageFilter<
InternalImageType,
OutputImageType > CastFilterType;
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::FastMarchingImageFilter<
InternalImageType,
InternalImageType > FastMarchingFilterType;
FastMarchingFilterType::Pointer fastMarching = FastMarchingFilterType::New();
typedef itk::ChangeInformationImageFilter<InternalImageType> ChangeInformationFilterType ;
ChangeInformationFilterType::Pointer changeInformationFilter = ChangeInformationFilterType::New();
changeInformationFilter->ChangeSpacingOn();
changeInformationFilter->ChangeOriginOn();
changeInformationFilter->ChangeDirectionOn();
typedef itk::GeodesicActiveContourLevelSetImageFilter< InternalImageType,
InternalImageType > GeodesicActiveContourFilterType;
GeodesicActiveContourFilterType::Pointer geodesicActiveContour =
GeodesicActiveContourFilterType::New();
const double propagationScaling = 0.25;
geodesicActiveContour->SetPropagationScaling( propagationScaling );
geodesicActiveContour->SetCurvatureScaling( 1 );
geodesicActiveContour->SetAdvectionScaling( 0.5 );
geodesicActiveContour->SetMaximumRMSError( 0.02 );
geodesicActiveContour->SetNumberOfIterations( 800 );
changeInformationFilter->SetInput(reader->GetOutput());
gradientMagnitude->SetInput( changeInformationFilter->GetOutput() );
sigmoid->SetInput( gradientMagnitude->GetOutput() );
geodesicActiveContour->SetInput( fastMarching->GetOutput() );
geodesicActiveContour->SetFeatureImage( sigmoid->GetOutput() );
thresholder->SetInput( geodesicActiveContour->GetOutput() );
writer->SetInput( thresholder->GetOutput() );
const double sigma = 0.55 ;
gradientMagnitude->SetSigma( sigma );
const double alpha = -0.1;
const double beta = 100;
sigmoid->SetAlpha( alpha );
sigmoid->SetBeta( beta );
typedef FastMarchingFilterType::NodeContainer NodeContainer;
typedef FastMarchingFilterType::NodeType NodeType;
NodeContainer::Pointer seeds = NodeContainer::New();
InternalImageType::IndexType seedPosition;
seedPosition[0] = 370;//661 ; //370 ; // 81;
seedPosition[1] = 443;//559 ; //443 ; // 114;
seedPosition[2] = 1;
const double initialDistance = 5;
NodeType node;
const double seedValue = - initialDistance;
node.SetValue( seedValue );
node.SetIndex( seedPosition );
seeds->Initialize();
seeds->InsertElement( 0, node );
fastMarching->SetTrialPoints( seeds );
fastMarching->SetSpeedConstant( 1.0 );
fastMarching->SetOutputSize(
changeInformationFilter->GetOutput()->GetBufferedRegion().GetSize() );
try
{
gradientMagnitude->Update();
std::cout<<"gradientMagnitude update"<<std::endl;
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
}
sigmoid->Update();
std::cout<<"sigmoid update"<<std::endl;
fastMarching->SetOutputSize(
reader->GetOutput()->GetBufferedRegion().GetSize() );
fastMarching->Update();
std::cout<<"fastMarching update"<<std::endl;
try
{
geodesicActiveContour->Update();
std::cout<<"geodesicActiveContour update"<<std::endl;
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
}
writer->Update();
std::cout<<"writer update"<<std::endl;
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;
return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20130811/dc3b3e95/attachment.htm>
More information about the Insight-users
mailing list