[Insight-users] EM-algorithm
sami bourouis
sami.bourouis at hotmail.com
Wed Dec 6 05:10:13 EST 2006
>From: "sami bourouis" <sami.bourouis at hotmail.com>
>To: insight-users-request at itk.org, insight-users at itk.org
>Subject: [Insight-users] EM-algorithm
>Date: Wed, 06 Dec 2006 09:56:17 +0000
>
>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/
>
>_______________________________________________
>Insight-users mailing list
>Insight-users at itk.org
>http://www.itk.org/mailman/listinfo/insight-users
_________________________________________________________________
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