📄 itkmrfimagefiltertest.cxx
字号:
//Slice 3
//--------------------------------------------------------------------------
for( k=0; k< halfHeight; k++)
{
//Vector no. 1-3 Row k
for( i=0; i< (halfWidth*2); ++i, ++classoutIt ) classoutIt.Set( 2 );
}
//Row 4-6
for( k=0; k< halfHeight; k++)
{
for( i=0; i< (halfWidth*2); ++i, ++classoutIt ) classoutIt.Set( 1 );
}
//----------------------------------------------------------------------
// Test code for the supervised classifier algorithm
//----------------------------------------------------------------------
//---------------------------------------------------------------------
// Multiband data is now available in the right format
//---------------------------------------------------------------------
//----------------------------------------------------------------------
//Set membership function (Using the statistics objects)
//----------------------------------------------------------------------
namespace stat = itk::Statistics;
typedef stat::MahalanobisDistanceMembershipFunction< VecImagePixelType >
MembershipFunctionType ;
typedef MembershipFunctionType::Pointer MembershipFunctionPointer ;
typedef std::vector< MembershipFunctionPointer >
MembershipFunctionPointerVector;
//----------------------------------------------------------------------
// Set the image model estimator (train the class models)
//----------------------------------------------------------------------
typedef itk::ImageGaussianModelEstimator<VecImageType,
MembershipFunctionType, ClassImageType>
ImageGaussianModelEstimatorType;
ImageGaussianModelEstimatorType::Pointer
applyEstimateModel = ImageGaussianModelEstimatorType::New();
applyEstimateModel->SetNumberOfModels(NUM_CLASSES);
applyEstimateModel->SetInputImage(vecImage);
applyEstimateModel->SetTrainingImage(classImage);
//Run the gaussian classifier algorithm
applyEstimateModel->Update();
applyEstimateModel->Print(std::cout);
MembershipFunctionPointerVector membershipFunctions =
applyEstimateModel->GetMembershipFunctions();
//----------------------------------------------------------------------
//Set the decision rule
//----------------------------------------------------------------------
typedef itk::DecisionRuleBase::Pointer DecisionRuleBasePointer;
typedef itk::MinimumDecisionRule DecisionRuleType;
DecisionRuleType::Pointer
myDecisionRule = DecisionRuleType::New();
//----------------------------------------------------------------------
// Set the classifier to be used and assigne the parameters for the
// supervised classifier algorithm except the input image which is
// grabbed from the MRF application pipeline.
//----------------------------------------------------------------------
//---------------------------------------------------------------------
typedef VecImagePixelType MeasurementVectorType;
typedef itk::ImageClassifierBase< VecImageType,
ClassImageType > ClassifierType;
typedef itk::ClassifierBase<VecImageType>::Pointer
ClassifierBasePointer;
typedef ClassifierType::Pointer ClassifierPointer;
ClassifierPointer myClassifier = ClassifierType::New();
// Set the Classifier parameters
myClassifier->SetNumberOfClasses(NUM_CLASSES);
// Set the decison rule
myClassifier->
SetDecisionRule((DecisionRuleBasePointer) myDecisionRule );
//Add the membership functions
for( unsigned int ii=0; ii<NUM_CLASSES; ii++ )
{
myClassifier->AddMembershipFunction( membershipFunctions[ii] );
}
//----------------------------------------------------------------------
// Set the MRF labeller and populate the parameters
//----------------------------------------------------------------------
//Set the MRF labeller
typedef itk::MRFImageFilter<VecImageType,ClassImageType> MRFImageFilterType;
MRFImageFilterType::Pointer applyMRFImageFilter = MRFImageFilterType::New();
// Set the MRF labeller parameters
applyMRFImageFilter->SetNumberOfClasses( NUM_CLASSES );
applyMRFImageFilter->SetMaximumNumberOfIterations( MAX_NUM_ITER );
applyMRFImageFilter->SetErrorTolerance( 0.10 );
applyMRFImageFilter->SetSmoothingFactor( 1 );
//For setting up a square/cubic or hypercubic neighborhood
applyMRFImageFilter->SetNeighborhoodRadius( NEIGHBORHOOD_RAD );
//For setting up a rectangular/cuboidal or hypercuboidal neighborhood
//itk::Size<NDIMENSION> radius = {{1, 10, 5}};
//applyMRFImageFilter->SetNeighborhoodRadius( radius );
applyMRFImageFilter->SetInput(vecImage);
applyMRFImageFilter->SetClassifier( myClassifier );
//Kick off the MRF labeller function
applyMRFImageFilter->Update();
applyMRFImageFilter->Print(std::cout);
std::cout << "Number of Iterations : " << applyMRFImageFilter->GetNumberOfIterations()
<< std::endl;
std::cout << "Stop condition: (1) Maximum number of iterations (2) Error tolerance: "
<< applyMRFImageFilter->GetStopCondition() << std::endl;
ClassImageType::Pointer outClassImage = applyMRFImageFilter->GetOutput();
//Testing of different parameter access functions in the filter
std::cout << "The number of classes labelled was: " <<
applyMRFImageFilter->GetNumberOfClasses() << std::endl;
std::cout << "The maximum number of iterations were: " <<
applyMRFImageFilter->GetMaximumNumberOfIterations() << std::endl;
std::cout << "The error tolerace threshold was: " <<
applyMRFImageFilter->GetErrorTolerance() << std::endl;
std::cout << "The smoothing MRF parameter used was: " <<
applyMRFImageFilter->GetSmoothingFactor() << std::endl;
std::cout << "The MRF neighborhood weights are: " << std::endl;
//Test other optional access functions to test coverage
std::vector<double> MRFNeighborhoodWeight =
applyMRFImageFilter->GetMRFNeighborhoodWeight();
std::vector<double> testNewNeighborhoodWeight( MRFNeighborhoodWeight.size(), 1);
applyMRFImageFilter->SetMRFNeighborhoodWeight( testNewNeighborhoodWeight );
//Print the mrf labelled image
ClassImageIterator labeloutIt( outClassImage, outClassImage->GetBufferedRegion() );
int sumtmp =0;
while( !labeloutIt.IsAtEnd() )
{
sumtmp += (int) labeloutIt.Get();
++labeloutIt;
}
//---------------------------------------------------------------------
// Set up the neighborhood iterators and the valid neighborhoods
// for iteration
//---------------------------------------------------------------------
//Set up the nighborhood iterators
// Labelled image neighborhood interator typedef
typedef itk::NeighborhoodIterator< ClassImageType >
OutImageNeighborhoodIterator;
typedef OutImageNeighborhoodIterator::RadiusType
OutImageNeighborhoodRadiusType;
typedef
itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< ClassImageType >
OutImageFacesCalculator;
typedef OutImageFacesCalculator::FaceListType OutImageFaceListType;
typedef OutImageFaceListType::iterator OutImageFaceListIterator;
OutImageNeighborhoodRadiusType outImageNeighborhoodRadius;
outImageNeighborhoodRadius.Fill( 1 );
//Define the face list for the input/labelled image
OutImageFacesCalculator outImageFacesCalculator;
OutImageFaceListType outImageFaceList;
//Compute the faces for the neighborhoods in the input/labelled image
outImageFaceList =
outImageFacesCalculator( outClassImage,
outClassImage->GetBufferedRegion(),
outImageNeighborhoodRadius );
//Set up a face list iterator
OutImageFaceListIterator outImageFaceListIter
= outImageFaceList.begin();
//Walk through the entire data set (not visiting the boundaries )
OutImageNeighborhoodIterator
nOutImageNeighborhoodIter( outImageNeighborhoodRadius,
outClassImage,
*outImageFaceListIter );
int sum = 0;
typedef ClassImageType::PixelType ClassImagePixelType;
ClassImagePixelType *outLabel;
//Loop through the labelled region and add the pixel labels
while( !nOutImageNeighborhoodIter.IsAtEnd() )
{
outLabel = nOutImageNeighborhoodIter.GetCenterValue();
sum += ( int ) (*outLabel);
++nOutImageNeighborhoodIter;
}
//Loop through the data set
if( sum == 22 )
{
std::cout<< "MRF labeller Test Passed" << std::endl;
}
else
{
std::cout<< "MRF labeller Test failed" << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -