ITK/Examples/Segmentation/VoronoiDiagram2DGenerator: Difference between revisions

From KitwarePublic
< ITK‎ | Examples
Jump to navigationJump to search
(→‎VoronoiDiagram2DGenerator.cxx: Update according to PR #12: https://github.com/InsightSoftwareConsortium/ITKWikiExamples/pull/12/files)
(Deprecated content that is moved to sphinx)
 
Line 1: Line 1:
==VoronoiDiagram2DGenerator.cxx==
{{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.}}
 
<source lang="cpp">
 
#include "itkVoronoiDiagram2DGenerator.h"
#include "itkImageFileWriter.h"
#include "itkVTKPolyDataWriter.h"
 
int main( int, char* [] )
{
  constexpr double height = 100;
  constexpr double width = 100;
 
  using VoronoiDiagramType = itk::VoronoiDiagram2D<double>;
  using VoronoiGeneratorType = itk::VoronoiDiagram2DGenerator<double>;
 
  using PointType = VoronoiDiagramType::PointType;
  using CellType = VoronoiDiagramType::CellType;
  using CellAutoPointer = VoronoiDiagramType::CellAutoPointer;
  using PointIdIterator = CellType::PointIdIterator;
  using NeighborIdIterator = VoronoiDiagramType::NeighborIdIterator;
 
  VoronoiDiagramType::Pointer voronoiDiagram = VoronoiDiagramType::New();
  VoronoiGeneratorType::Pointer voronoiGenerator = VoronoiGeneratorType::New();
 
  PointType insize;
  insize[0] = width;
  insize[1] = height;
  voronoiGenerator->SetBoundary(insize);
 
  // Create a list of seeds
  std::vector<PointType> seeds;
  PointType seed0;
  seed0[0] = 50;
  seed0[1] = 50;
  seeds.push_back(seed0);
 
  PointType seed1;
  seed1[0] = 25;
  seed1[1] = 25;
  seeds.push_back(seed1);
 
  PointType seed2;
  seed2[0] = 75;
  seed2[1] = 25;
  seeds.push_back(seed2);
 
  PointType seed3;
  seed3[0] = 25;
  seed3[1] = 75;
  seeds.push_back(seed3);
 
  PointType seed4;
  seed4[0] = 75;
  seed4[1] = 75;
  seeds.push_back(seed4);
 
  for(const auto & seed : seeds)
    {
    voronoiGenerator->AddOneSeed(seed);
    }
 
  voronoiGenerator->Update();
  voronoiDiagram = voronoiGenerator->GetOutput();
 
  for(unsigned int i = 0; i < seeds.size(); i++)
    {
    PointType currP = voronoiDiagram->GetSeed(i);
    std::cout << "Seed No." << i << ": At (" << currP[0] << "," << currP[1] << ")" << std::endl;
    std::cout << " Boundary Vertices List (in order):";
    CellAutoPointer currCell;
    voronoiDiagram->GetCellId(i, currCell);
    PointIdIterator currCellP;
    for(currCellP = currCell->PointIdsBegin(); currCellP != currCell->PointIdsEnd(); ++currCellP)
      {
      std::cout << (*currCellP) << ",";
      }
    std::cout << std::endl;
    std::cout << "  Neighbors (Seed No.):";
    NeighborIdIterator currNeibor;
    for(currNeibor = voronoiDiagram->NeighborIdsBegin(i); currNeibor != voronoiDiagram->NeighborIdsEnd(i); ++currNeibor)
      {
      std::cout << (*currNeibor) << ",";
      }
    std::cout << std::endl << std::endl;
    }
 
  std::cout << "Vertices Informations:" << std::endl;
  VoronoiDiagramType::VertexIterator allVerts;
  int j = 0;
  for(allVerts = voronoiDiagram->VertexBegin(); allVerts != voronoiDiagram->VertexEnd(); ++allVerts)
    {
    std::cout << "Vertices No." << j;
    j++;
#if ITK_VERSION_MAJOR < 4
    std::cout << ": At (" << (*allVerts)[0] << "," << (*allVerts)[1] << ")" << std::endl;
#else
    std::cout << ": At (" << (allVerts.Value())[0] << "," << (allVerts.Value())[1] << ")" << std::endl;
#endif
    }
 
  // Write the resulting mesh
  using WriterType = itk::VTKPolyDataWriter<VoronoiDiagramType::Superclass>;
  WriterType::Pointer vtkPolyDataWriter = WriterType::New();
  vtkPolyDataWriter->SetInput(voronoiDiagram);
  vtkPolyDataWriter->SetFileName("voronoi.vtk");
  vtkPolyDataWriter->Update();
 
  // Setup an image to visualize the input
  {
  using ImageType = itk::Image< unsigned char, 2>;
 
  ImageType::IndexType start;
  start.Fill(0);
 
  ImageType::SizeType size;
  size.Fill(100);
 
   ImageType::RegionType region(start,size);
 
  ImageType::Pointer image = ImageType::New();
  image->SetRegions(region);
  image->Allocate();
  image->FillBuffer(0);
 
  ImageType::IndexType ind;
  ind[0] = 50;
  ind[1] = 50;
  image->SetPixel(ind, 255);
 
  ind[0] = 25;
  ind[1] = 25;
  image->SetPixel(ind, 255);
 
  ind[0] = 75;
  ind[1] = 25;
  image->SetPixel(ind, 255);
 
  ind[0] = 25;
  ind[1] = 75;
  image->SetPixel(ind, 255);
 
  ind[0] = 75;
  ind[1] = 75;
  image->SetPixel(ind, 255);
 
  using ImageWriterType = itk::ImageFileWriter< ImageType  >;
  ImageWriterType::Pointer imageFileWriter = ImageWriterType::New();
  imageFileWriter->SetFileName("image.png");
  imageFileWriter->SetInput(image);
  imageFileWriter->Update();
  }
 
  return EXIT_SUCCESS;
}
 
</source>
 
{{ITKCMakeLists|{{SUBPAGENAME}}}}

Latest revision as of 15:38, 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.