ITK/Examples/Broken/Statistics/ExpectationMaximizationMixtureModelEstimator Image: Difference between revisions
Daviddoria (talk | contribs) (Converted from itkImageToListSampleAdaptor to itkImageToListSampleFilter) |
Daviddoria (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
The clusters are not computed correctly. | The clusters are not computed correctly. | ||
==ExpectationMaximizationMixtureModelEstimator_Image.cxx== | ==ExpectationMaximizationMixtureModelEstimator_Image.cxx== | ||
Line 21: | Line 7: | ||
#include "itkGaussianMixtureModelComponent.h" | #include "itkGaussianMixtureModelComponent.h" | ||
#include "itkExpectationMaximizationMixtureModelEstimator.h" | #include "itkExpectationMaximizationMixtureModelEstimator.h" | ||
#include "itkSampleClassifierFilter.h" | #include "itkSampleClassifierFilter.h" | ||
#include "itkMaximumDecisionRule2.h" | #include "itkMaximumDecisionRule2.h" | ||
#include "itkImageToListSampleFilter.h" | #include "itkImageToListSampleFilter.h" | ||
#include "itkCovariantVector.h" | #include "itkCovariantVector.h" | ||
#include "itkImageRegionIterator.h" | #include "itkImageRegionIterator.h" | ||
#include "itkImageFileReader.h" | #include "itkImageFileReader.h" | ||
#include "itkSimpleFilterWatcher.h" | |||
typedef itk::CovariantVector<unsigned char, 3> PixelType; | typedef itk::CovariantVector<unsigned char, 3> PixelType; | ||
typedef itk::Image<PixelType, 2> ImageType; | typedef itk::Image<PixelType, 2> ImageType; | ||
void | void ControlledImage(ImageType::Pointer image); | ||
void RandomImage(ImageType::Pointer image); | |||
int main(int argc, char*argv[]) | int main(int argc, char*argv[]) | ||
{ | { | ||
ImageType::Pointer image = ImageType::New(); | ImageType::Pointer image = ImageType::New(); | ||
RandomImage(image); | |||
//image | //ControlledImage(image); | ||
typedef itk::Statistics::ImageToListSampleFilter<ImageType> ImageToListSampleFilterType; | typedef itk::Statistics::ImageToListSampleFilter<ImageType> ImageToListSampleFilterType; | ||
ImageToListSampleFilterType::Pointer imageToListSampleFilter = ImageToListSampleFilterType::New(); | ImageToListSampleFilterType::Pointer imageToListSampleFilter = ImageToListSampleFilterType::New(); | ||
Line 58: | Line 35: | ||
unsigned int numberOfClasses = 3; | unsigned int numberOfClasses = 3; | ||
typedef itk::Array< double > ParametersType; | typedef itk::Array< double > ParametersType; | ||
Line 71: | Line 45: | ||
params[i] = 5.0; // mean of dimension i | params[i] = 5.0; // mean of dimension i | ||
} | } | ||
for(unsigned int i = | unsigned int counter = 0; | ||
for(unsigned int i = 0; i < 3; i++) | |||
{ | { | ||
params[ | for(unsigned int j = 0; j < 3; j++) | ||
{ | |||
if(i == j) | |||
{ | |||
params[3+counter] = 5; // diagonal | |||
} | |||
else | |||
{ | |||
params[3+counter] = 0; // off-diagonal | |||
} | |||
counter++; | |||
} | |||
} | } | ||
initialParameters[0] = params; | initialParameters[0] = params; | ||
Line 82: | Line 69: | ||
params[1] = 5.0; | params[1] = 5.0; | ||
params[2] = 5.0; | params[2] = 5.0; | ||
for(unsigned int i = | counter = 0; | ||
for(unsigned int i = 0; i < 3; i++) | |||
{ | { | ||
params[ | for(unsigned int j = 0; j < 3; j++) | ||
{ | |||
if(i == j) | |||
{ | |||
params[3+counter] = 5; // diagonal | |||
} | |||
else | |||
{ | |||
params[3+counter] = 0; // off-diagonal | |||
} | |||
counter++; | |||
} | |||
} | } | ||
initialParameters[1] = params; | initialParameters[1] = params; | ||
Line 92: | Line 91: | ||
params[1] = 210.0; | params[1] = 210.0; | ||
params[2] = 5.0; | params[2] = 5.0; | ||
for(unsigned int i = | counter = 0; | ||
for(unsigned int i = 0; i < 3; i++) | |||
{ | { | ||
params[ | for(unsigned int j = 0; j < 3; j++) | ||
{ | |||
if(i == j) | |||
{ | |||
params[3+counter] = 5; // diagonal | |||
} | |||
else | |||
{ | |||
params[3+counter] = 0; // off-diagonal | |||
} | |||
counter++; | |||
} | |||
} | } | ||
initialParameters[2] = params; | initialParameters[2] = params; | ||
Line 106: | Line 117: | ||
typedef itk::Statistics::GaussianMixtureModelComponent< ImageToListSampleFilterType::ListSampleType > | typedef itk::Statistics::GaussianMixtureModelComponent< ImageToListSampleFilterType::ListSampleType > | ||
ComponentType; | ComponentType; | ||
std::cout << "Number of samples: " << imageToListSampleFilter->GetOutput()->GetTotalFrequency() << std::endl; | |||
// Create the components | // Create the components | ||
Line 115: | Line 128: | ||
(components[i])->SetParameters( initialParameters[i] ); | (components[i])->SetParameters( initialParameters[i] ); | ||
} | } | ||
typedef itk::Statistics::ExpectationMaximizationMixtureModelEstimator< | typedef itk::Statistics::ExpectationMaximizationMixtureModelEstimator< | ||
Line 127: | Line 141: | ||
initialProportions[1] = 0.33; | initialProportions[1] = 0.33; | ||
initialProportions[2] = 0.33; | initialProportions[2] = 0.33; | ||
std::cout << "Initial proportions: " << initialProportions << std::endl; | |||
estimator->SetInitialProportions( initialProportions ); | estimator->SetInitialProportions( initialProportions ); | ||
Line 132: | Line 148: | ||
for ( unsigned int i = 0 ; i < numberOfClasses ; i++) | for ( unsigned int i = 0 ; i < numberOfClasses ; i++) | ||
{ | { | ||
estimator->AddComponent | estimator->AddComponent( components[i]); | ||
} | } | ||
//itk::SimpleFilterWatcher watcher(estimator); | |||
estimator->Update(); | estimator->Update(); | ||
Line 194: | Line 209: | ||
} | } | ||
void | void ControlledImage(ImageType::Pointer image) | ||
{ | { | ||
// Create an image | // Create an image | ||
Line 247: | Line 262: | ||
imageIterator.Set(black); | imageIterator.Set(black); | ||
} | } | ||
++imageIterator; | |||
} | |||
} | |||
void RandomImage(ImageType::Pointer image) | |||
{ | |||
// Create an image | |||
ImageType::RegionType region; | |||
ImageType::IndexType start; | |||
start[0] = 0; | |||
start[1] = 0; | |||
ImageType::SizeType size; | |||
size[0] = 10; | |||
size[1] = 10; | |||
region.SetSize(size); | |||
region.SetIndex(start); | |||
image->SetRegions(region); | |||
image->Allocate(); | |||
itk::ImageRegionIterator<ImageType> imageIterator(image,region); | |||
imageIterator.GoToBegin(); | |||
while(!imageIterator.IsAtEnd()) | |||
{ | |||
// Get a random color | |||
itk::CovariantVector<unsigned char, 3> pixel; | |||
pixel[0] = rand() * 255; | |||
pixel[1] = rand() * 255; | |||
pixel[2] = rand() * 255; | |||
imageIterator.Set(pixel); | |||
++imageIterator; | ++imageIterator; | ||
} | } |
Revision as of 00:02, 24 November 2010
The clusters are not computed correctly.
ExpectationMaximizationMixtureModelEstimator_Image.cxx
<source lang="cpp">
- include "itkVector.h"
- include "itkListSample.h"
- include "itkGaussianMixtureModelComponent.h"
- include "itkExpectationMaximizationMixtureModelEstimator.h"
- include "itkSampleClassifierFilter.h"
- include "itkMaximumDecisionRule2.h"
- include "itkImageToListSampleFilter.h"
- include "itkCovariantVector.h"
- include "itkImageRegionIterator.h"
- include "itkImageFileReader.h"
- include "itkSimpleFilterWatcher.h"
typedef itk::CovariantVector<unsigned char, 3> PixelType; typedef itk::Image<PixelType, 2> ImageType;
void ControlledImage(ImageType::Pointer image); void RandomImage(ImageType::Pointer image);
int main(int argc, char*argv[]) {
ImageType::Pointer image = ImageType::New();
RandomImage(image); //ControlledImage(image);
typedef itk::Statistics::ImageToListSampleFilter<ImageType> ImageToListSampleFilterType; ImageToListSampleFilterType::Pointer imageToListSampleFilter = ImageToListSampleFilterType::New(); imageToListSampleFilter->SetInput(image); imageToListSampleFilter->Update();
unsigned int numberOfClasses = 3;
typedef itk::Array< double > ParametersType; ParametersType params( numberOfClasses + numberOfClasses*numberOfClasses ); // 3 for means and 9 for 3x3 covariance
// Create the first set (for the first cluster/model) of initial parameters std::vector< ParametersType > initialParameters( numberOfClasses ); for(unsigned int i = 0; i < 3; i++) { params[i] = 5.0; // mean of dimension i } unsigned int counter = 0; for(unsigned int i = 0; i < 3; i++) { for(unsigned int j = 0; j < 3; j++) { if(i == j) { params[3+counter] = 5; // diagonal } else { params[3+counter] = 0; // off-diagonal } counter++; } }
initialParameters[0] = params;
// Create the second set (for the second cluster/model) of initial parameters params[0] = 210.0; params[1] = 5.0; params[2] = 5.0; counter = 0; for(unsigned int i = 0; i < 3; i++) { for(unsigned int j = 0; j < 3; j++) { if(i == j) { params[3+counter] = 5; // diagonal } else { params[3+counter] = 0; // off-diagonal } counter++; } } initialParameters[1] = params;
// Create the third set (for the third cluster/model) of initial parameters params[0] = 5.0; params[1] = 210.0; params[2] = 5.0; counter = 0; for(unsigned int i = 0; i < 3; i++) { for(unsigned int j = 0; j < 3; j++) { if(i == j) { params[3+counter] = 5; // diagonal } else { params[3+counter] = 0; // off-diagonal } counter++; } } initialParameters[2] = params;
std::cout << "Initial parameters: " << std::endl; for ( unsigned int i = 0 ; i < numberOfClasses ; i++ ) { std::cout << initialParameters[i] << std::endl; }
typedef itk::Statistics::GaussianMixtureModelComponent< ImageToListSampleFilterType::ListSampleType > ComponentType;
std::cout << "Number of samples: " << imageToListSampleFilter->GetOutput()->GetTotalFrequency() << std::endl;
// Create the components std::vector< ComponentType::Pointer > components; for ( unsigned int i = 0 ; i < numberOfClasses ; i++ ) { components.push_back( ComponentType::New() ); (components[i])->SetSample( imageToListSampleFilter->GetOutput() ); (components[i])->SetParameters( initialParameters[i] ); }
typedef itk::Statistics::ExpectationMaximizationMixtureModelEstimator< ImageToListSampleFilterType::ListSampleType > EstimatorType; EstimatorType::Pointer estimator = EstimatorType::New();
estimator->SetSample( imageToListSampleFilter->GetOutput() ); estimator->SetMaximumIteration( 200 );
itk::Array< double > initialProportions(numberOfClasses); initialProportions[0] = 0.33; initialProportions[1] = 0.33; initialProportions[2] = 0.33;
std::cout << "Initial proportions: " << initialProportions << std::endl;
estimator->SetInitialProportions( initialProportions );
for ( unsigned int i = 0 ; i < numberOfClasses ; i++) { estimator->AddComponent( components[i]); } //itk::SimpleFilterWatcher watcher(estimator); estimator->Update();
// Output the results 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: "; // Outputs: // mean of dimension 1, mean of dimension 2, covariance(0,0), covariance(0,1), covariance(1,0), covariance(1,1) std::cout << " " << estimator->GetProportions()[i] << std::endl; }
// Display the membership of each sample typedef itk::Statistics::SampleClassifierFilter< ImageToListSampleFilterType::ListSampleType > FilterType;
typedef itk::Statistics::MaximumDecisionRule2 DecisionRuleType; DecisionRuleType::Pointer decisionRule = DecisionRuleType::New();
typedef FilterType::ClassLabelVectorObjectType ClassLabelVectorObjectType; typedef FilterType::ClassLabelVectorType ClassLabelVectorType;
ClassLabelVectorObjectType::Pointer classLabelsObject = ClassLabelVectorObjectType::New(); ClassLabelVectorType & classLabelVector = classLabelsObject->Get();
typedef FilterType::ClassLabelType ClassLabelType;
ClassLabelType class0 = 0; classLabelVector.push_back( class0 );
ClassLabelType class1 = 1; classLabelVector.push_back( class1 );
ClassLabelType class2 = 2; classLabelVector.push_back( class2 );
FilterType::Pointer sampleClassifierFilter = FilterType::New(); sampleClassifierFilter->SetInput( imageToListSampleFilter->GetOutput() ); sampleClassifierFilter->SetNumberOfClasses( numberOfClasses ); sampleClassifierFilter->SetClassLabels( classLabelsObject ); sampleClassifierFilter->SetDecisionRule( decisionRule ); sampleClassifierFilter->SetMembershipFunctions( estimator->GetOutput() ); sampleClassifierFilter->Update();
const FilterType::MembershipSampleType* membershipSample = sampleClassifierFilter->GetOutput(); FilterType::MembershipSampleType::ConstIterator iter = membershipSample->Begin();
while ( iter != membershipSample->End() ) { std::cout << (int)iter.GetMeasurementVector()[0] << " " << (int)iter.GetMeasurementVector()[1] << " " << (int)iter.GetMeasurementVector()[2] << " : " << iter.GetClassLabel() << std::endl; ++iter; }
return EXIT_SUCCESS;
}
void ControlledImage(ImageType::Pointer image) {
// Create an image ImageType::RegionType region; ImageType::IndexType start; start[0] = 0; start[1] = 0;
ImageType::SizeType size; size[0] = 10; size[1] = 10;
region.SetSize(size); region.SetIndex(start);
image->SetRegions(region); image->Allocate();
// Make a red and a green square itk::CovariantVector<unsigned char, 3> green; green[0] = 0; green[1] = 255; green[2] = 0;
itk::CovariantVector<unsigned char, 3> red; red[0] = 255; red[1] = 0; red[2] = 0;
itk::CovariantVector<unsigned char, 3> black; black[0] = 0; black[1] = 0; black[2] = 0;
itk::ImageRegionIterator<ImageType> imageIterator(image,region); imageIterator.GoToBegin();
while(!imageIterator.IsAtEnd()) { if(imageIterator.GetIndex()[0] > 2 && imageIterator.GetIndex()[0] < 5 && imageIterator.GetIndex()[1] > 2 && imageIterator.GetIndex()[1] < 5) { imageIterator.Set(green); } else if(imageIterator.GetIndex()[0] > 6 && imageIterator.GetIndex()[0] < 9 && imageIterator.GetIndex()[1] > 6 && imageIterator.GetIndex()[1] < 9) { imageIterator.Set(red); } else { imageIterator.Set(black); } ++imageIterator; }
}
void RandomImage(ImageType::Pointer image) {
// Create an image ImageType::RegionType region; ImageType::IndexType start; start[0] = 0; start[1] = 0;
ImageType::SizeType size; size[0] = 10; size[1] = 10;
region.SetSize(size); region.SetIndex(start);
image->SetRegions(region); image->Allocate();
itk::ImageRegionIterator<ImageType> imageIterator(image,region); imageIterator.GoToBegin();
while(!imageIterator.IsAtEnd()) { // Get a random color itk::CovariantVector<unsigned char, 3> pixel; pixel[0] = rand() * 255; pixel[1] = rand() * 255; pixel[2] = rand() * 255; imageIterator.Set(pixel); ++imageIterator; }
} </source>
CMakeLists.txt
<source lang="cmake"> cmake_minimum_required(VERSION 2.6)
PROJECT(ExpectationMaximizationMixtureModelEstimator)
FIND_PACKAGE(ITK REQUIRED) INCLUDE(${ITK_USE_FILE})
ADD_EXECUTABLE(ExpectationMaximizationMixtureModelEstimator_Image ExpectationMaximizationMixtureModelEstimator_Image.cxx) TARGET_LINK_LIBRARIES(ExpectationMaximizationMixtureModelEstimator_Image ITKBasicFilters ITKCommon ITKIO ITKStatistics)
</source>