예제 #1
0
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;
}