ITK/Examples/ImageProcessing/LabelGeometryImageFilter: Difference between revisions

From KitwarePublic
< ITK‎ | Examples
Jump to navigationJump to search
(Added QuickView and input file.)
(Deprecated content that is moved to sphinx)
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
'''NOTE:''' Requires a QuickView as of April 8, 2015. Otherwise, comment out InterpolateOff() statements.
{{warning|1=The media wiki content on this page is no longer maintainedThe examples presented on the https://itk.org/Wiki/* pages likely require ITK version 4.13 or earlier releasesIn many cases, the examples on this page no longer conform to the best practices for modern ITK versions.
==LabelGeometryImageFilter.cxx==
}}
<source lang="cpp">
#include "itkImage.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"
#include "itkImageFileReader.h"
#include "itkLabelGeometryImageFilter.h"
#include "itkLabelToRGBImageFilter.h"
 
#include "QuickView.h"
 
#include <sstream>
 
typedef itk::Image<unsigned int, 2>  ImageType;
typedef itk::RGBPixel<unsigned char> RGBPixelType;
typedef itk::Image<RGBPixelType, 2>  RGBImageType;
 
static void CreateIntensityImage(ImageType::Pointer image);
static void CreateLabelImage(ImageType::Pointer image);
 
int main(int argc, char *argv[])
{
  ImageType::Pointer labelImage = ImageType::New();
  ImageType::Pointer intensityImage = ImageType::New();
  int label = 1;
 
  if (argc < 2)
    {
    // Create a label image that is 0 in the background and where the
    // objects are labeled
    CreateLabelImage(labelImage);
    labelImage->Print(std::cout);
    // Create an intensity imageSome LabelGeometry features (such as
    // weighted centroid and integrated intensity) depend on an
    // intensity image.
    CreateIntensityImage(intensityImage);
    }
  else if (argc > 3)
    {
    typedef itk::ImageFileReader< ImageType  > ImageReaderType;
    ImageReaderType::Pointer labelReader =
      ImageReaderType::New();
    labelReader->SetFileName(argv[1]);
    labelReader->Update();
 
    labelImage = labelReader->GetOutput();
 
    ImageReaderType::Pointer intensityReader =
      ImageReaderType::New();
    intensityReader->SetFileName(argv[2]);
    intensityReader->Update();
 
    intensityImage = intensityReader->GetOutput();
 
    label = atoi(argv[3]);
    }
 
  // NOTE: As of April 8, 2015 the filter does not work with non-zero
  // origins
  double origin[2] = {0.0, 0.0};
  labelImage->SetOrigin(origin);
  intensityImage->SetOrigin(origin);
 
  typedef itk::LabelGeometryImageFilter< ImageType > LabelGeometryImageFilterType;
  LabelGeometryImageFilterType::Pointer labelGeometryImageFilter = LabelGeometryImageFilterType::New();
  labelGeometryImageFilter->SetInput( labelImage );
  labelGeometryImageFilter->SetIntensityInput( intensityImage );
 
  // These generate optional outputs.
  labelGeometryImageFilter->CalculatePixelIndicesOn();
  labelGeometryImageFilter->CalculateOrientedBoundingBoxOn();
  labelGeometryImageFilter->CalculateOrientedLabelRegionsOn();
  labelGeometryImageFilter->CalculateOrientedIntensityRegionsOn();
 
  labelGeometryImageFilter->Update();
  LabelGeometryImageFilterType::LabelsType allLabels =
    labelGeometryImageFilter->GetLabels();
 
  typedef itk::LabelToRGBImageFilter<ImageType, RGBImageType> RGBFilterType;
  RGBFilterType::Pointer rgbLabelImage =
    RGBFilterType::New();
  rgbLabelImage->SetInput(labelImage);
 
  typedef itk::LabelToRGBImageFilter<ImageType, RGBImageType> RGBFilterType;
  RGBFilterType::Pointer rgbOrientedImage =
    RGBFilterType::New();
  rgbOrientedImage->SetInput(labelGeometryImageFilter->GetOrientedLabelImage(allLabels[label]));
 
  QuickView viewer;
  viewer.ShareCameraOff();
  viewer.InterpolateOff();
 
  viewer.AddImage(
    rgbLabelImage->GetOutput(),
    true,
    argc > 3 ? itksys::SystemTools::GetFilenameName(argv[1]) : "Generated label image");  
  viewer.AddImage(
    intensityImage.GetPointer(),
    true,
    argc > 3 ? itksys::SystemTools::GetFilenameName(argv[2]) : "Generated intensity image");
 
  std::stringstream desc;
  desc << "Oriented Label: " << allLabels[label];
  viewer.AddImage(
    rgbOrientedImage->GetOutput(),
    true,
    desc.str()); 
 
  std::stringstream desc2;
  desc2 << "Oriented Intensity: " << allLabels[label];
   viewer.AddImage(
    labelGeometryImageFilter->GetOrientedIntensityImage(allLabels[label]),
    true,
    desc2.str()); 
  viewer.Visualize();
 
  LabelGeometryImageFilterType::LabelsType::iterator allLabelsIt;
  std::cout << "Number of labels: "
            << labelGeometryImageFilter->GetNumberOfLabels() << std::endl;
  std::cout << std::endl;
 
  for( allLabelsIt = allLabels.begin(); allLabelsIt != allLabels.end(); allLabelsIt++ )
    {
    LabelGeometryImageFilterType::LabelPixelType labelValue = *allLabelsIt;
    std::cout << "\tLabel: "
              << (int)labelValue << std::endl;
    std::cout << "\tVolume: "
              << labelGeometryImageFilter->GetVolume(labelValue) << std::endl;
    std::cout << "\tIntegrated Intensity: "
              << labelGeometryImageFilter->GetIntegratedIntensity(labelValue) << std::endl;
    std::cout << "\tCentroid: "
              << labelGeometryImageFilter->GetCentroid(labelValue) << std::endl;
    std::cout << "\tWeighted Centroid: "
              << labelGeometryImageFilter->GetWeightedCentroid(labelValue) << std::endl;
    std::cout << "\tAxes Length: "
              << labelGeometryImageFilter->GetAxesLength(labelValue) << std::endl;
    std::cout << "\tMajorAxisLength: "
              << labelGeometryImageFilter->GetMajorAxisLength(labelValue) << std::endl;
    std::cout << "\tMinorAxisLength: "
              << labelGeometryImageFilter->GetMinorAxisLength(labelValue) << std::endl;
    std::cout << "\tEccentricity: "
              << labelGeometryImageFilter->GetEccentricity(labelValue) << std::endl;
    std::cout << "\tElongation: "
              << labelGeometryImageFilter->GetElongation(labelValue) << std::endl;
    std::cout << "\tOrientation: "
              << labelGeometryImageFilter->GetOrientation(labelValue) << std::endl;
    std::cout << "\tBounding box: "
              << labelGeometryImageFilter->GetBoundingBox(labelValue) << std::endl;
   
    std::cout << std::endl << std::endl;
    }
 
  return EXIT_SUCCESS;
}
 
void CreateIntensityImage(ImageType::Pointer image)
{
  // Create a random image.
  ImageType::IndexType start;
  start.Fill(0);
 
  ImageType::SizeType size;
  size.Fill(20);
 
  ImageType::RegionType region;
  region.SetSize(size);
  region.SetIndex(start);
  image->SetRegions(region);
  image->Allocate();
 
  itk::ImageRegionIterator<ImageType> imageIterator(image,image->GetLargestPossibleRegion());
  // Make a random image
  // Create an unchanging seed.
  srand(1);
  while(!imageIterator.IsAtEnd())
    {
    int randomNumber = rand() % 255;
    imageIterator.Set( randomNumber );
    ++imageIterator;
    }
}
 
void CreateLabelImage(ImageType::Pointer image)
{
  // Create a black image with labeled squares.
  ImageType::IndexType start;
  start.Fill(0);
 
  ImageType::SizeType size;
  size.Fill(20);
 
  ImageType::RegionType region;
  region.SetSize(size);
  region.SetIndex(start);
  image->SetRegions(region);
  image->Allocate();
 
  itk::ImageRegionIterator<ImageType> imageIterator(image,image->GetLargestPossibleRegion());
 
  // Make a square
  while(!imageIterator.IsAtEnd())
    {
    if((imageIterator.GetIndex()[0] > 5 && imageIterator.GetIndex()[0] < 10) &&
      (imageIterator.GetIndex()[1] > 5 && imageIterator.GetIndex()[1] < 10) )
        {
        imageIterator.Set(85);
        }
    else if((imageIterator.GetIndex()[0] > 11 && imageIterator.GetIndex()[0] < 17) &&
      (imageIterator.GetIndex()[1] > 11 && imageIterator.GetIndex()[1] < 17) )
{
imageIterator.Set(127);
}
    else if((imageIterator.GetIndex()[0] > 11 && imageIterator.GetIndex()[0] < 17) &&
      (imageIterator.GetIndex()[1] > 1 && imageIterator.GetIndex()[1] < 5) )
{
imageIterator.Set(191);
}
    else
        {
        imageIterator.Set(0);
        }
 
    ++imageIterator;
    }
}
</source>
 
{{ITKCMakeLists|{{SUBPAGENAME}}}}

Latest revision as of 19:49, 4 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.