itkmribiasfieldcorrectionfiltertest.cxx
来自「InsightToolkit-1.4.0(有大量的优化算法程序)」· CXX 代码 · 共 296 行
CXX
296 行
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile: itkMRIBiasFieldCorrectionFilterTest.cxx,v $
Language: C++
Date: $Date: 2003/09/10 14:30:03 $
Version: $Revision: 1.7 $
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include <iostream>
#include "vnl/vnl_vector.h"
#include "itkMRIBiasFieldCorrectionFilter.h"
#include "itkImage.h"
#include "itkImageRegionIteratorWithIndex.h"
#include "itkGaussianImageSource.h"
#include "itkMultivariateLegendrePolynomial.h"
#include "itkCompositeValleyFunction.h"
#include "itkNormalVariateGenerator.h"
#include "itkArray.h"
#include "itkImageFileWriter.h"
#include "itkSphereSpatialFunction.h"
int itkMRIBiasFieldCorrectionFilterTest ( int , char* [] )
{
typedef itk::Image< float, 3 > ImageType ;
typedef itk::Image< float, 3 > MaskType ;
typedef itk::ImageRegionIteratorWithIndex< ImageType > ImageIteratorType ;
bool SaveImages = false ;
ImageType::SizeType imageSize ;
ImageType::IndexType imageIndex ;
ImageType::RegionType imageRegion ;
imageSize[0] = 30 ;
imageSize[1] = 30 ;
imageSize[2] = 10 ;
imageIndex.Fill( 0 ) ;
float spacing[3] = {1.0, 1.0, 1.0} ;
float origin[3] = {0, 0, 0} ;
imageRegion.SetSize( imageSize ) ;
imageRegion.SetIndex( imageIndex ) ;
// creates an image that will stores the Gaussian pixel * bias values
ImageType::Pointer imageWithBias = ImageType::New() ;
imageWithBias->SetBufferedRegion( imageRegion ) ;
imageWithBias->SetLargestPossibleRegion( imageRegion ) ;
imageWithBias->SetSpacing( spacing ) ;
imageWithBias->SetOrigin( origin ) ;
imageWithBias->Allocate() ;
// creates the image source with a sphere.
ImageType::Pointer image = ImageType::New() ;
image->SetBufferedRegion( imageRegion ) ;
image->SetLargestPossibleRegion( imageRegion ) ;
image->SetSpacing( spacing ) ;
image->SetOrigin( origin ) ;
image->Allocate() ;
// creates an image for bias
ImageType::Pointer biasImage = ImageType::New() ;
biasImage->SetBufferedRegion( imageRegion ) ;
biasImage->SetLargestPossibleRegion( imageRegion ) ;
biasImage->SetSpacing( spacing ) ;
biasImage->SetOrigin( origin ) ;
biasImage->Allocate() ;
// class statistics for two classes: a bright sphere and background
itk::Array<double> classMeans(2) ;
itk::Array<double> classSigmas(2) ;
classMeans[0] = 10.0 ;
classMeans[1] = 200.0 ;
classSigmas[0] = 1.0 ;
classSigmas[1] = 10.0 ;
// creats a normal random variate generator
itk::Statistics::NormalVariateGenerator::Pointer randomGenerator =
itk::Statistics::NormalVariateGenerator::New() ;
// fills the image with a sphere filled with intensity values from a
// normal distribution.
typedef itk::SphereSpatialFunction<3> SphereType;
SphereType::Pointer sphere = SphereType::New();
SphereType::InputType center;
center[0] = imageSize[0]/2;
center[1] = imageSize[1]/2;
center[2] = imageSize[2]/2;
sphere->SetCenter( center );
sphere->SetRadius( 5.0 ) ;
randomGenerator->Initialize( 2003 ) ;
ImageIteratorType i_iter( image , imageRegion ) ;
SphereType::InputType point ;
while ( !i_iter.IsAtEnd() )
{
image->TransformIndexToPhysicalPoint( i_iter.GetIndex() , point ) ;
if ( sphere->Evaluate( point ) == 1 ) // inside or on surface
{
i_iter.Set( randomGenerator->GetVariate() * classSigmas[1]
+ classMeans[1] ) ;
}
else
{
i_iter.Set( classMeans[0] ) ;
}
++i_iter ;
}
// creates a bias field
typedef itk::MultivariateLegendrePolynomial BiasFieldType ;
BiasFieldType::DomainSizeType biasSize(3) ;
int biasDegree = 3 ;
biasSize[0] = imageSize[0] ;
biasSize[1] = imageSize[1] ;
biasSize[2] = imageSize[2] ;
BiasFieldType bias(biasSize.size(),
biasDegree, // bias field degree
biasSize) ;
// generates the coefficients using the normal random variate generator.
BiasFieldType::CoefficientArrayType
coefficients(bias.GetNumberOfCoefficients()) ;
randomGenerator->Initialize( (int) 2003 ) ;
for ( unsigned int i = 0 ; i < bias.GetNumberOfCoefficients() ; ++i )
{
coefficients[i] = ( randomGenerator->GetVariate() + 1 ) * 0.01 ;
}
bias.SetCoefficients(coefficients) ;
// set the imageWithBias pixel values with imageSource pixel value +
// bias.
ImageIteratorType ib_iter( imageWithBias,
imageWithBias->GetLargestPossibleRegion() ) ;
BiasFieldType::SimpleForwardIterator b_iter( &bias ) ;
i_iter.GoToBegin() ;
float temp ;
while ( !i_iter.IsAtEnd() )
{
temp = i_iter.Get() * (2 + b_iter.Get()) ;
ib_iter.Set( temp ) ;
++i_iter ;
++ib_iter ;
++b_iter ;
}
// creates a bias correction filter and run it.
typedef itk::MRIBiasFieldCorrectionFilter<ImageType, ImageType, MaskType>
FilterType ;
FilterType::Pointer filter = FilterType::New() ;
// To see the debug output for each iteration, uncomment the
// following line.
// filter->DebugOn() ;
filter->SetInput( imageWithBias.GetPointer() ) ;
filter->IsBiasFieldMultiplicative( true ) ;
filter->SetBiasFieldDegree( biasDegree ) ;
filter->SetTissueClassStatistics( classMeans, classSigmas ) ;
filter->SetOptimizerGrowthFactor( 1.01 ) ;
filter->SetOptimizerInitialRadius( 1.02 ) ;
filter->SetVolumeCorrectionMaximumIteration( 1000 ) ;
filter->SetUsingInterSliceIntensityCorrection( true ) ;
filter->SetInterSliceCorrectionMaximumIteration( 200 ) ;
filter->SetUsingSlabIdentification( true ) ;
filter->SetSlabBackgroundMinimumThreshold( 0 ) ; // default value
filter->SetSlabNumberOfSamples( 10 ) ; // default value
filter->SetSlabTolerance(0.0) ; // default value
filter->SetSlicingDirection( 2 ) ;
filter->SetUsingBiasFieldCorrection( true ) ; // default value
filter->SetGeneratingOutput( true ) ; // default value
filter->Update() ;
double sumOfError = 0.0 ;
ImageIteratorType o_iter( filter->GetOutput(),
filter->GetOutput()->GetLargestPossibleRegion() );
i_iter.GoToBegin() ;
while ( !i_iter.IsAtEnd() )
{
sumOfError += vnl_math_abs( o_iter.Get() - i_iter.Get() ) ;
++i_iter ;
++o_iter ;
}
b_iter.Begin() ;
ImageIteratorType bias_iter( biasImage.GetPointer(), imageRegion ) ;
while ( !b_iter.IsAtEnd() )
{
bias_iter.Set( b_iter.Get() + 2 ) ;
++b_iter ;
++bias_iter ;
}
if ( SaveImages )
{
typedef itk::ImageFileWriter< ImageType > WriterType ;
WriterType::Pointer writer = WriterType::New() ;
writer->SetInput( image ) ;
writer->SetFileName( "MRISource.mhd" ) ;
writer->Update() ;
WriterType::Pointer writer2 = WriterType::New() ;
writer2->SetInput(imageWithBias) ;
writer2->SetFileName( "MRISourceWithBias.mhd" ) ;
writer2->Update() ;
WriterType::Pointer writer3 = WriterType::New() ;
writer3->SetInput(filter->GetOutput()) ;
writer3->SetFileName( "MRICorrected.mhd" ) ;
writer3->Update() ;
WriterType::Pointer writer4 = WriterType::New() ;
writer4->SetInput( biasImage ) ;
writer4->SetFileName( "MRIBias.mhd" ) ;
writer4->Update() ;
}
std::cout << "Avg. error without input and output mask = "
<< sumOfError / (imageSize[0] * imageSize[1] * imageSize[2])
<< std::endl ;
filter->SetInput( imageWithBias.GetPointer() ) ;
filter->SetInputMask( image.GetPointer() ) ;
filter->SetOutputMask( image.GetPointer() ) ;
filter->Update() ;
sumOfError = 0.0 ;
ImageIteratorType o2_iter( filter->GetOutput(),
filter->GetOutput()->GetLargestPossibleRegion() );
i_iter.GoToBegin() ;
while ( !i_iter.IsAtEnd() )
{
sumOfError += vnl_math_abs( o2_iter.Get() - i_iter.Get() ) ;
++i_iter ;
++o2_iter ;
}
b_iter.Begin() ;
ImageIteratorType bias2_iter( biasImage.GetPointer(), imageRegion ) ;
while ( !b_iter.IsAtEnd() )
{
bias2_iter.Set( b_iter.Get() + 2 ) ;
++b_iter ;
++bias2_iter ;
}
std::cout << "Avg. error with input and output mask = "
<< sumOfError / (imageSize[0] * imageSize[1] * imageSize[2])
<< std::endl ;
std::cout << "Using slab identification: "
<< filter->GetUsingSlabIdentification() << std::endl ;
std::cout << "Slab identification background minimum intensity threshold: "
<< filter->GetSlabBackgroundMinimumThreshold() << std::endl ;
std::cout << "Slab number of samples per slice: "
<< filter->GetSlabNumberOfSamples() << std::endl ;
std::cout << "Slab identification tolerance: "
<< filter->GetSlabTolerance() << std::endl ;
std::cout << "Using bias field correction: "
<< filter->GetUsingBiasFieldCorrection() << std::endl ;
std::cout << "Generating output: "
<< filter->GetGeneratingOutput() << std::endl ;
std::cout << "Bias field degree: "
<< filter->GetBiasFieldDegree() << std::endl ;
std::cout << "Volume bias field correction iterations: "
<< filter->GetVolumeCorrectionMaximumIteration() << std::endl ;
std::cout << "Interslice bias field correction iterations: "
<< filter->GetInterSliceCorrectionMaximumIteration() << std::endl ;
std::cout << "Optimizer initial radius: "
<< filter->GetOptimizerInitialRadius() << std::endl ;
std::cout << "Optimizer growth factor: "
<< filter->GetOptimizerGrowthFactor() << std::endl ;
std::cout << "Optimizer shrink factor: "
<< filter->GetOptimizerShrinkFactor() << std::endl ;
return EXIT_SUCCESS ;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?