void meVTKSkeleton::ComputeAssociatedAverageOutwardFlux() { //To have a good quality gradient of the distance map, perform a light smooth over it. Define //convolution kernels in each direction and use them recursively. typedef itk::RecursiveGaussianImageFilter< SkeletonAPITypes::InputImageType , SkeletonAPITypes::InputImageType > RecursiveGaussianFilterType; RecursiveGaussianFilterType::Pointer gaussianFilterX = RecursiveGaussianFilterType::New(); RecursiveGaussianFilterType::Pointer gaussianFilterY = RecursiveGaussianFilterType::New(); RecursiveGaussianFilterType::Pointer gaussianFilterZ = RecursiveGaussianFilterType::New(); gaussianFilterX->SetDirection( 0 ); gaussianFilterY->SetDirection( 1 ); gaussianFilterZ->SetDirection( 2 ); gaussianFilterX->SetOrder( RecursiveGaussianFilterType::ZeroOrder ); gaussianFilterY->SetOrder( RecursiveGaussianFilterType::ZeroOrder ); gaussianFilterZ->SetOrder( RecursiveGaussianFilterType::ZeroOrder ); gaussianFilterX->SetNormalizeAcrossScale( false ); gaussianFilterY->SetNormalizeAcrossScale( false ); gaussianFilterZ->SetNormalizeAcrossScale( false ); gaussianFilterX->SetInput( this->inputData ); gaussianFilterY->SetInput( gaussianFilterX->GetOutput() ); gaussianFilterZ->SetInput( gaussianFilterY->GetOutput() ); gaussianFilterX->SetSigma( this->sigma ); gaussianFilterY->SetSigma( this->sigma ); gaussianFilterZ->SetSigma( this->sigma ); typedef itk::GradientImageFilter< SkeletonAPITypes::InputImageType , SkeletonAPITypes::InputPixelType, SkeletonAPITypes::InputPixelType > GradientFilterType; typedef GradientFilterType::OutputImageType::PixelType GradientPixelType; // Compute the gradient. GradientFilterType::Pointer gradientFilter = GradientFilterType::New(); gradientFilter->SetInput( gaussianFilterZ->GetOutput() ); // Compute the average outward flux. typedef itk::AverageOutwardFluxImageFilter< SkeletonAPITypes::InputImageType, SkeletonAPITypes::InputPixelType, GradientPixelType > AOFFilterType; AOFFilterType::Pointer aofFilter = AOFFilterType::New(); aofFilter->SetInput( this->inputData ); aofFilter->SetGradientImage( gradientFilter->GetOutput() ); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 2. Compute the skeleton ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef itk::MedialCurveImageFilter< SkeletonAPITypes::InputImageType > MedialCurveFilter; MedialCurveFilter::Pointer medialFilter = MedialCurveFilter::New(); medialFilter->SetInput( this->inputData ); medialFilter->SetAverageOutwardFluxImage( aofFilter->GetOutput() ); medialFilter->SetThreshold( this->threshold ); medialFilter->Update(); this->outputData = medialFilter->GetOutput(); }
bool VolumeProcess::RunRecursiveGaussianIIRRilter(float sigmaX, float sigmaY, float sigmaZ) { //by xiao liang typedef itk::RecursiveGaussianImageFilter< ImageType, ImageType > RecursiveGaussianFilterType; RecursiveGaussianFilterType::Pointer RecursiveGaussianFilterX = RecursiveGaussianFilterType::New(); RecursiveGaussianFilterType::Pointer RecursiveGaussianFilterY = RecursiveGaussianFilterType::New(); RecursiveGaussianFilterType::Pointer RecursiveGaussianFilterZ = RecursiveGaussianFilterType::New(); RecursiveGaussianFilterX->SetDirection(0); RecursiveGaussianFilterY->SetDirection(1); RecursiveGaussianFilterZ->SetDirection(2); RecursiveGaussianFilterX->SetOrder(RecursiveGaussianFilterType::ZeroOrder); RecursiveGaussianFilterY->SetOrder(RecursiveGaussianFilterType::ZeroOrder); RecursiveGaussianFilterZ->SetOrder(RecursiveGaussianFilterType::ZeroOrder); RecursiveGaussianFilterX->SetNormalizeAcrossScale(false); RecursiveGaussianFilterY->SetNormalizeAcrossScale(false); RecursiveGaussianFilterZ->SetNormalizeAcrossScale(false); RecursiveGaussianFilterX->SetSigma(sigmaX); RecursiveGaussianFilterX->SetSigma(sigmaY); RecursiveGaussianFilterX->SetSigma(sigmaZ); RecursiveGaussianFilterX->SetInput(m_outputImage); RecursiveGaussianFilterY->SetInput(RecursiveGaussianFilterX->GetOutput()); RecursiveGaussianFilterZ->SetInput(RecursiveGaussianFilterY->GetOutput()); try { RecursiveGaussianFilterZ->Update(); } catch( itk::ExceptionObject & err ) { std::cerr << "ITK FILTER ERROR: " << err << std::endl ; return false; } m_outputImage = RecursiveGaussianFilterZ->GetOutput(); if(debug) std::cerr << " RecursiveGaussianFilter Done" << std::endl; return true; }