[Insight-users] EM-algorithm
sami bourouis
sami.bourouis at hotmail.com
Wed Dec 6 04:56:17 EST 2006
Hi all,
I have a problem with the Expectation Maximization algorithm.
I read the tutorial and looked at the mailing list but there is not a single
example of how I would read an image, generate its histogram, feed it into
the EM and get the results.
Below is the code, EM is terminating with * termination code= 1 *.
I would appreciate if you could comment on what is wrong.
Thanks a lot for help!
#include "itkScalarImageToHistogramGenerator.h"
#include "itkImage.h"
#include "itkVector.h"
#include "itkListSample.h"
#include "itkGaussianMixtureModelComponent.h"
#include "itkExpectationMaximizationMixtureModelEstimator.h"
// Software Guide : EndCodeSnippet
#include "itkImageFileReader.h"
int main( int argc, char * argv [] )
{
/*
if( argc < 2 )
{
std::cerr << "Missing command line arguments" << std::endl;
std::cerr << "Usage : ImageHistogram1 inputImageFileName " <<
std::endl;
return -1;
}
*/
typedef unsigned char PixelType;
const unsigned int Dimension = 2;
typedef itk::Image<PixelType, Dimension > ImageType;
typedef itk::ImageFileReader< ImageType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName( "BrainT1Slice.png" );
try
{
reader->Update();
}
catch( itk::ExceptionObject & excp )
{
std::cerr << "Problem encoutered while reading image file : " << argv[1]
<< std::endl;
std::cerr << excp << std::endl;
return -1;
}
typedef itk::Statistics::ScalarImageToHistogramGenerator<
ImageType
>
HistogramGeneratorType;
HistogramGeneratorType::Pointer histogramGenerator =
HistogramGeneratorType::New();
histogramGenerator->SetInput( reader->GetOutput() );
histogramGenerator->SetNumberOfBins( 255 );
histogramGenerator->SetMarginalScale( 10.0 );
histogramGenerator->Compute();
typedef HistogramGeneratorType::HistogramType HistogramType;
const HistogramType * histogram = histogramGenerator->GetOutput();
const unsigned int histogramSize = histogram->Size();
std::cout << "Histogram size " << histogramSize << std::endl;
unsigned int bin;
for( bin=0; bin < histogramSize; bin++ )
{
std::cout << "bin = " << bin << " frequency = ";
std::cout << histogram->GetFrequency( bin, 0 ) << std::endl;
}
//*******************************
//=====end of histogram ========
//======start EM ================
unsigned int numberOfClasses = 2;
typedef itk::Vector< double, 1 > MeasurementVectorType;
typedef itk::Statistics::ListSample< MeasurementVectorType > SampleType;
SampleType::Pointer sample = SampleType::New();
for ( unsigned int i = 0 ; i < histogramSize ; ++i )
{
sample->PushBack( histogram->GetFrequency( i, 0 ) );//0 is for first
channel
}
//initial parameters for EM
typedef itk::Array< double > ParametersType;
ParametersType params( 2 );
std::vector< ParametersType > initialParameters( numberOfClasses );
params[0] = 50.0;
params[1] = 100.0;
initialParameters[0] = params;
params[0] = 200.0;
params[1] = 150.0;
initialParameters[1] = params;
// EM will estimate with Gaussians
typedef itk::Statistics::GaussianMixtureModelComponent< SampleType >
ComponentType;
std::vector< ComponentType::Pointer > components;
for ( unsigned int i = 0 ; i < numberOfClasses ; i++ )
{
components.push_back( ComponentType::New() );
(components[i])->SetSample( sample );
(components[i])->SetParameters( initialParameters[i] );
}
typedef itk::Statistics::ExpectationMaximizationMixtureModelEstimator<
SampleType > EstimatorType;
EstimatorType::Pointer estimator = EstimatorType::New();
estimator->SetSample( sample );
estimator->SetMaximumIteration( 300 );
itk::Array< double > initialProportions(numberOfClasses);
initialProportions[0] = 0.5;
initialProportions[1] = 0.5;
estimator->SetInitialProportions( initialProportions );
for ( unsigned int i = 0 ; i < numberOfClasses ; i++)
{
estimator->AddComponent( (ComponentType::Superclass*)
(components[i]).GetPointer() );
}
try
{
estimator->Update();
}
catch( itk::ExceptionObject & excp )
{
std::cerr << "Problem encoutered while estimating" << std::endl;
std::cerr << excp << std::endl;
return -1;
}
int termincode = estimator->GetTerminationCode (); // CONVERGED = 0,
NOT_CONVERGED = 1 }
std::cout<<"termination code= "<<termincode<<std::endl;
for ( unsigned int i = 0 ; i < numberOfClasses ; i++ )
{
std::cout << "Cluster[" << i << "]" << std::endl;
std::cout << " Parameters:" << std::endl;
std::cout << " " << (components[i])->GetFullParameters()
<< std::endl;
std::cout << " Proportion: ";
std::cout << " " << (*estimator->GetProportions())[i] <<
std::endl;
}
return 0;
}
_________________________________________________________________
MSN Hotmail sur i-mode : envoyez et recevez des e-mails depuis votre
téléphone portable ! http://www.msn.fr/hotmailimode/
More information about the Insight-users
mailing list