ITK/Examples/WishList/Segmentation/kMeansClustering: Difference between revisions

From KitwarePublic
< ITK‎ | Examples
Jump to navigationJump to search
(Match filename to wiki page name.)
(Deprcated)
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
==kMeansClustering.cxx==
{{warning|1=The media wiki content on this page is no longer maintained. The examples presented on the https://itk.org/Wiki/* pages likely require ITK version 4.13 or earlier releases.   In many cases, the examples on this page no longer conform to the best practices for modern ITK versions.}}
<source lang="cpp">
#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkScalarImageKmeansImageFilter.h>
 
int main( int argc, char * argv [] )
{
  //sample usage
  //./kMeansClustering input.jpg output.jpg 1 3 0 100 200
 
  //verify command line arguments
  if( argc < 5 )
    {
    std::cerr << "Usage: " << std::endl;
    std::cerr << argv[0];
    std::cerr << " inputScalarImage outputLabeledImage contiguousLabels";
    std::cerr << " numberOfClasses mean1 mean2... meanN " << std::endl;
    return EXIT_FAILURE;
    }
 
  //parse command line arguments
  const char * inputImageFileName = argv[1];
  const char * outputImageFileName = argv[2];
  const unsigned int useNonContiguousLabels = atoi( argv[3] );
  const unsigned int numberOfInitialClasses = atoi( argv[4] );
 
  const unsigned int argoffset = 5;
 
  if( static_cast<unsigned int>(argc) <
      numberOfInitialClasses + argoffset )
    {
    std::cerr << "Error: " << std::endl;
    std::cerr << numberOfInitialClasses << " classes has been specified ";
    std::cerr << "but no enough means have been provided in the command ";
    std::cerr << "line arguments " << std::endl;
    return EXIT_FAILURE;
    }
   
  std::vector<double> userMeans;
  for( unsigned k = 0; k < numberOfInitialClasses; k++ )
    {
    const double userProvidedInitialMean = atof( argv[k+argoffset] );
    userMeans.push_back(userProvidedInitialMean);
    }
   
  // Define the pixel type and dimension of the image that we intend to
  // classify.
 
  typedef signed short      PixelType;
  const unsigned int          Dimension = 2;
 
  typedef itk::Image<PixelType, Dimension > ImageType;
 
  // create a reader 
  typedef itk::ImageFileReader< ImageType > ReaderType;
  ReaderType::Pointer reader = ReaderType::New();
  reader->SetFileName( inputImageFileName );
 
  // Instantiate the ScalarImageKmeansImageFilter  
   typedef itk::ScalarImageKmeansImageFilter< ImageType > KMeansFilterType;
 
  KMeansFilterType::Pointer kmeansFilter = KMeansFilterType::New();
 
  kmeansFilter->SetInput( reader->GetOutput() );
 
  // Make the output image intellegable by expanding the range of output image values, if desired
 
  kmeansFilter->SetUseNonContiguousLabels( useNonContiguousLabels );
 
  // initialize using the user input means
 
    for( unsigned k = 0; k < numberOfInitialClasses; k++ )
    {
    kmeansFilter->AddClassWithInitialMean( userMeans[k] );
    }
 
  // Create and setup a writer
 
  typedef KMeansFilterType::OutputImageType  OutputImageType;
 
  typedef itk::ImageFileWriter< OutputImageType > WriterType;
 
  WriterType::Pointer writer = WriterType::New();
 
  writer->SetInput( kmeansFilter->GetOutput() );
 
  writer->SetFileName( outputImageFileName );
 
  // execut the pipeline
  try
    {
    writer->Update();
    }
  catch( itk::ExceptionObject & excp )
    {
    std::cerr << "Problem encountered while writing ";
    std::cerr << " image file : " << outputImageFileName << std::endl;
    std::cerr << excp << std::endl;
    return EXIT_FAILURE;
    }
 
  // inspect the means
  KMeansFilterType::ParametersType estimatedMeans =
                                            kmeansFilter->GetFinalMeans();
 
  const unsigned int numberOfClasses = estimatedMeans.Size();
 
  for ( unsigned int i = 0 ; i < numberOfClasses ; ++i )
    {
    std::cout << "cluster[" << i << "] ";
    std::cout << "    estimated mean : " << estimatedMeans[i] << std::endl;
    }
 
  return EXIT_SUCCESS;
 
}
 
</source>
 
{{ITKCMakeLists|kMeansClustering|}}

Latest revision as of 22:15, 7 June 2019

Warning: The media wiki content on this page is no longer maintained. The examples presented on the https://itk.org/Wiki/* pages likely require ITK version 4.13 or earlier releases. In many cases, the examples on this page no longer conform to the best practices for modern ITK versions.