[Insight-users] KdTreeBasedKMeansClustering for 3D vector image

Sara Rolfe smrolfe at u.washington.edu
Thu Dec 2 17:30:27 EST 2010


Thanks for the additional example.  I have not yet gotten it to run,  
since I think I'm dealing with some version issues (I'm using  
itk-3.14).  RIght now it's not recognizing itkMinimumDecisionRule2,  
itkSampleClassifierFilter, etc.  I will let you know when I'm able to  
get this working.  Is it possible that using older versions of these  
filters is part of my problem?

In the meantime, with my code, the estimated mean vectors are  
calculated correctly, but when I add the classification I getting the  
following error:

error: no matching function for call to  
‘itk 
::Statistics 
::SampleClassifier 
< 
main 
(int 
,char 
**)::SampleType 
 > 
::SetSample 
(itk::SmartPointer<itk::Statistics::ImageToListAdaptor<main(int,  
char**)::ImageType, main(int, char**)::PixelType> >&)’

...itkSampleClassifier.txx:56: note: candidates are: void  
itk::Statistics::SampleClassifier<TSample>::SetSample(const TSample*)  
[with TSample = main(int, char**)::SampleType]


So there's a problem when I set my classifier sample.  My full code is  
below.

#include "itkKdTree.h"
#include "itkKdTreeBasedKmeansEstimator.h"
#include "itkWeightedCentroidKdTreeGenerator.h"

#include "itkImageToListAdaptor.h"
#include "itkImageFileReader.h"
#include "itkImage.h"

#include "itkMinimumDecisionRule.h"
#include "itkEuclideanDistance.h"
#include "itkSampleClassifier.h"

#include "itkVector.h"
#include "itkListSample.h"
#include "itkDistanceToCentroidMembershipFunction.h"



int main(  int argc,  char * argv[]  )
{
	if( argc < 5 )
     {
		std::cerr << "Usage: " << std::endl;
		std::cerr << argv[0];
		std::cerr << " inputVectorImage.vtk outputLabeledImage.vtk";
		std::cerr << " numberOfClasses numberOfComponents " << std::endl;
		return EXIT_FAILURE;
     }
	
	typedef itk::Vector< unsigned char, 2 >	PixelType;
	typedef itk::Image< PixelType, 3 > ImageType;
	typedef itk::ImageFileReader< ImageType > ReaderType;
	typedef itk::Statistics::ImageToListAdaptor< ImageType > AdaptorType;
	typedef itk::Statistics::WeightedCentroidKdTreeGenerator<AdaptorType  
 > TreeGeneratorType;
	typedef TreeGeneratorType::KdTreeType TreeType;
	typedef itk:: Statistics:: KdTreeBasedKmeansEstimator< TreeType >  
EstimatorType;
	typedef itk::Vector< PixelType, 3 > MeasurementVectorType;
	typedef itk::Statistics::EuclideanDistance< MeasurementVectorType >  
MembershipFunctionType;
	typedef itk::MinimumDecisionRule DecisionRuleType;
	typedef itk::Statistics::ListSample< MeasurementVectorType >  
SampleType;
	typedef itk::Statistics::SampleClassifier< SampleType > ClassifierType;
	
	const char * inputImageFileName = argv[1];
	const char * outputImageFileName = argv[2];
	int numberOfClasses = atoi( argv[3] );
	int numberOfComponents = atoi( argv[4] );
	
	ReaderType::Pointer reader = ReaderType::New();
	reader->SetFileName( inputImageFileName );
	reader->Update();
	
	AdaptorType::Pointer adaptor = AdaptorType::New();
	adaptor->SetImage(  reader->GetOutput() );
	
	TreeGeneratorType::Pointer treeGenerator = TreeGeneratorType::New();
	treeGenerator->SetSample( adaptor );
	treeGenerator->SetBucketSize( 16 );
	treeGenerator->Update();

	EstimatorType::Pointer estimator = EstimatorType::New();
	EstimatorType::ParametersType initialMeans( numberOfClasses *  
numberOfComponents );
	estimator->SetParameters( initialMeans );
	estimator->SetKdTree( treeGenerator->GetOutput() );
	estimator->SetMaximumIteration( 200 );
	estimator->SetCentroidPositionChangesThreshold(0.0);
	estimator->StartOptimization();
	
	EstimatorType::ParametersType estimatedMeans = estimator- 
 >GetParameters();

	for ( int i = 0 ; i < numberOfClasses ; ++i )
     {
		std::cout << "cluster[" << i << "] ";
		std::cout << "  estimated mean : ";
		for ( int j = 0 ; j < numberOfComponents ; ++j )
		{
			std::cout << "    " << estimatedMeans[ i * numberOfComponents + j ];
		}
		std::cout << std::endl;
     }

	//classification using estimated means - this is the part that is not  
working correctly
	DecisionRuleType::Pointer decisionRule = DecisionRuleType::New();
	
	ClassifierType::Pointer classifier = ClassifierType::New();
	classifier->SetDecisionRule( (itk::DecisionRuleBase::Pointer)  
decisionRule);
	classifier->SetSample( adaptor );
	classifier->SetNumberOfClasses( 7 );
	
	std::vector< unsigned int > classLabels;
	classLabels.resize( numberOfClasses );
	for ( int i = 0 ; i < numberOfClasses ; ++i )
     {
		classLabels[i] = i;
	}
	classifier->SetMembershipFunctionClassLabels( classLabels );
	
}

On Dec 1, 2010, at 6:32 PM, Luis Ibanez wrote:

> Voila !
>
> http://www.itk.org/Wiki/ITK/Examples/Statistics/KdTreeBasedKMeansClustering_3D
>
> Thanks for pointing to these examples David.
>
>
> Sara,
>
> when running the example above,
> the code seems to behave correctly.
>
> Please give it a try and let us know
> if you see anything out of order.
>
>
>    Thanks
>
>
>      Luis
>
>
> -----------------------------------------
> On Wed, Dec 1, 2010 at 8:31 PM, David Doria <daviddoria at gmail.com>  
> wrote:
>> On Wed, Dec 1, 2010 at 8:16 PM, Luis Ibanez  
>> <luis.ibanez at kitware.com> wrote:
>>> Hi Sara,
>>>
>>> The KdTree should work in N-D.
>>>
>>> We tend to do 2D test just because they are
>>> easier to debug, but we probably should add
>>> a 3D one in this case.
>>>
>>> Could you tell us more about the behavior of
>>> this class that lead you to believe that is doing
>>> something incorrect ?
>>>
>>> A minimal example will be greatly appreciated...
>>
>>
>> Are these the examples you were looking at?
>>
>> http://www.vtk.org/Wiki/ITK/Examples/Statistics/KdTreeBasedKMeansClustering_1D
>> http://www.vtk.org/Wiki/ITK/Examples/Statistics/KdTreeBasedKMeansClustering_2D
>>
>> If not, maybe they will help. If so, please add
>> http://www.vtk.org/Wiki/ITK/Examples/Statistics/KdTreeBasedKMeansClustering_3D
>>
>> and we can work on it there.
>>
>> David
>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20101202/376e1cad/attachment.htm>


More information about the Insight-users mailing list