72 int main(
int argc,
char * argv[])
76 std::cerr <<
"Usage: " << std::endl;
78 std::cerr <<
" inputScalarImage inputLabeledImage";
79 std::cerr <<
" outputLabeledImage numberOfIterations";
80 std::cerr <<
" smoothingFactor numberOfClasses";
81 std::cerr <<
" mean1 mean2 ... meanN " << std::endl;
85 const char * inputImageFileName = argv[1];
86 const char * inputLabelImageFileName = argv[2];
87 const char * outputImageFileName = argv[3];
89 const unsigned int numberOfIterations = atoi(argv[4]);
90 const double smoothingFactor = atof(argv[5]);
91 const unsigned int numberOfClasses = atoi(argv[6]);
93 const unsigned int numberOfArgumentsBeforeMeans = 7;
95 if (static_cast<unsigned int>(argc) <
96 numberOfClasses + numberOfArgumentsBeforeMeans)
98 std::cerr <<
"Error: " << std::endl;
99 std::cerr << numberOfClasses <<
" classes has been specified ";
100 std::cerr <<
"but no enough means have been provided in the command ";
101 std::cerr <<
"line arguments " << std::endl;
115 typedef unsigned char PixelType;
116 const unsigned int Dimension = 2;
121 ReaderType::Pointer reader = ReaderType::New();
122 reader->SetFileName(inputImageFileName);
135 typedef unsigned char LabelPixelType;
140 LabelReaderType::Pointer labelReader = LabelReaderType::New();
141 labelReader->SetFileName(inputLabelImageFileName);
162 ImageType, ArrayImageType> ScalarToArrayFilterType;
164 ScalarToArrayFilterType::Pointer
165 scalarToArrayFilter = ScalarToArrayFilterType::New();
166 scalarToArrayFilter->SetInput(reader->GetOutput());
181 MRFFilterType::Pointer mrfFilter = MRFFilterType::New();
183 mrfFilter->SetInput(scalarToArrayFilter->GetOutput());
196 mrfFilter->SetNumberOfClasses(numberOfClasses);
197 mrfFilter->SetMaximumNumberOfIterations(numberOfIterations);
198 mrfFilter->SetErrorTolerance(1e-7);
213 mrfFilter->SetSmoothingFactor(smoothingFactor);
229 LabelImageType> SupervisedClassifierType;
231 SupervisedClassifierType::Pointer classifier =
232 SupervisedClassifierType::New();
249 DecisionRuleType::Pointer classifierDecisionRule = DecisionRuleType::New();
251 classifier->SetDecisionRule(classifierDecisionRule.GetPointer());
266 MembershipFunctionType;
268 typedef MembershipFunctionType::Pointer MembershipFunctionPointer;
270 double meanDistance = 0;
272 for (
unsigned int i = 0; i < numberOfClasses; ++i)
274 MembershipFunctionPointer membershipFunction =
275 MembershipFunctionType::New();
277 centroid[0] = atof(argv[i + numberOfArgumentsBeforeMeans]);
279 membershipFunction->SetCentroid(centroid);
281 classifier->AddMembershipFunction(membershipFunction);
282 meanDistance +=
static_cast<double> (centroid[0]);
284 meanDistance /= numberOfClasses;
301 mrfFilter->SetNeighborhoodRadius(1);
318 std::vector<double> weights;
319 weights.push_back(1.5);
320 weights.push_back(2.0);
321 weights.push_back(1.5);
322 weights.push_back(2.0);
323 weights.push_back(0.0);
324 weights.push_back(2.0);
325 weights.push_back(1.5);
326 weights.push_back(2.0);
327 weights.push_back(1.5);
341 double totalWeight = 0;
342 for (std::vector<double>::const_iterator wcIt = weights.begin();
343 wcIt != weights.end(); ++wcIt)
345 totalWeight += *wcIt;
347 for (std::vector<double>::iterator wIt = weights.begin();
348 wIt != weights.end(); wIt++)
350 *wIt =
static_cast<double> ((*wIt) * meanDistance / (2 * totalWeight));
353 mrfFilter->SetMRFNeighborhoodWeight(weights);
363 mrfFilter->SetClassifier(classifier);
377 typedef MRFFilterType::OutputImageType OutputImageType;
383 OutputImageType, RescaledOutputImageType> RescalerType;
385 RescalerType::Pointer intensityRescaler = RescalerType::New();
386 intensityRescaler->SetOutputMinimum(0);
387 intensityRescaler->SetOutputMaximum(255);
388 intensityRescaler->SetInput(mrfFilter->GetOutput());
393 WriterType::Pointer writer = WriterType::New();
395 writer->SetInput(intensityRescaler->GetOutput());
397 writer->SetFileName(outputImageFileName);
415 std::cerr <<
"Problem encountered while writing ";
416 std::cerr <<
" image file : " << argv[2] << std::endl;
417 std::cerr << excp << std::endl;
422 std::cout <<
"Number of Iterations : ";
423 std::cout << mrfFilter->GetNumberOfIterations() << std::endl;
424 std::cout <<
"Stop condition: " << std::endl;
425 std::cout <<
" (1) Maximum number of iterations " << std::endl;
426 std::cout <<
" (2) Error tolerance: " << std::endl;
427 std::cout << mrfFilter->GetStopCondition() << std::endl;