47 int main(
int argc,
char * argv[])
51 std::cerr <<
"Usage: " << std::endl;
53 std::cerr <<
" inputScalarImage outputLabeledImage contiguousLabels";
54 std::cerr <<
" numberOfClasses mean1 mean2... meanN " << std::endl;
58 const char * inputImageFileName = argv[1];
70 typedef signed short PixelType;
71 const unsigned int Dimension = 2;
76 ReaderType::Pointer reader = ReaderType::New();
77 reader->SetFileName(inputImageFileName);
91 KMeansFilterType::Pointer kmeansFilter = KMeansFilterType::New();
93 kmeansFilter->SetInput(reader->GetOutput());
95 const unsigned int numberOfInitialClasses = atoi(argv[4]);
115 const unsigned int useNonContiguousLabels = atoi(argv[3]);
117 kmeansFilter->SetUseNonContiguousLabels(useNonContiguousLabels);
120 const unsigned int argoffset = 5;
122 if (static_cast<unsigned int>(argc) <
123 numberOfInitialClasses + argoffset)
125 std::cerr <<
"Error: " << std::endl;
126 std::cerr << numberOfInitialClasses <<
" classes has been specified ";
127 std::cerr <<
"but no enough means have been provided in the command ";
128 std::cerr <<
"line arguments " << std::endl;
143 for (
unsigned k = 0; k < numberOfInitialClasses; ++k)
145 const double userProvidedInitialMean = atof(argv[k + argoffset]);
146 kmeansFilter->AddClassWithInitialMean(userProvidedInitialMean);
150 const char * outputImageFileName = argv[2];
164 typedef KMeansFilterType::OutputImageType OutputImageType;
168 WriterType::Pointer writer = WriterType::New();
170 writer->SetInput(kmeansFilter->GetOutput());
172 writer->SetFileName(outputImageFileName);
190 std::cerr <<
"Problem encountered while writing ";
191 std::cerr <<
" image file : " << argv[2] << std::endl;
192 std::cerr << excp << std::endl;
206 KMeansFilterType::ParametersType estimatedMeans =
207 kmeansFilter->GetFinalMeans();
209 const unsigned int numberOfClasses = estimatedMeans.Size();
211 for (
unsigned int i = 0; i < numberOfClasses; ++i)
213 std::cout <<
"cluster[" << i <<
"] ";
214 std::cout <<
" estimated mean : " << estimatedMeans[i] << std::endl;