[Insight-users] pointsets

Luis Ibanez luis.ibanez at kitware.com
Sat, 20 Mar 2004 14:01:04 -0500


Hi David,

An example on how to convert an itk::Image to
an itk::PointSet was added to

   Insight/Examples/DataRepresentation/Mesh

with the name:

        ImageToPointSet.cxx


Note that converting an Image to a PoinSet
is an extremly inefficient way of using the
memory.  You probably want to select only a
subset of image pixels to be included in the
PointSet.


Regards,


     Luis


Please find the code below:


---------------------------
David Macias Verde wrote:

> Hi:
> 
> How can I produce a pointset from an image?
> 
> Thanks in advance,
> 
------------------------------------------


#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"


#include "itkImage.h"
#include "itkPointSet.h"
#include "itkImageRegionConstIterator.h"


int main( int argc, char ** argv )
{
   // Verify the number of parameters in the command line
   if( argc < 2 )
     {
     std::cerr << "Usage: " << std::endl;
     std::cerr << argv[0] << " inputImageFile  " << std::endl;
     return -1;
     }


   typedef unsigned char      PixelType;
   const   unsigned int       Dimension = 2;

   typedef itk::Image< PixelType, Dimension >    ImageType;

   typedef itk::PointSet< PixelType, Dimension > PointSetType;



   typedef itk::ImageFileReader< ImageType >  ReaderType;

   ReaderType::Pointer reader = ReaderType::New();

   const char * inputFilename  = argv[1];
   reader->SetFileName( inputFilename  );

   try
     {
     reader->Update();
     }
   catch( itk::ExceptionObject & err )
     {
     std::cout << "ExceptionObject caught !" << std::endl;
     std::cout << err << std::endl;
     return -1;
     }

   PointSetType::Pointer  pointSet = PointSetType::New();


   typedef itk::ImageRegionConstIterator< ImageType > IteratorType;

   const ImageType * image = reader->GetOutput();

   IteratorType it( image, image->GetBufferedRegion() );

   it.GoToBegin();


   typedef PointSetType::PointType     PointType;
   PointType point;

   unsigned long pointId = 0;

   while( !it.IsAtEnd() )
     {

     // Convert the pixel position into a Point
     image->TransformIndexToPhysicalPoint( it.GetIndex() , point );
     pointSet->SetPoint( pointId, point );

     // Transfer the pixel data to the value associated with the point.
     pointSet->SetPointData( pointId, it.Get() );

     ++it;
     ++pointId;
     }

   std::cout << "Number Of Points = ";
   std::cout << pointSet->GetNumberOfPoints() << std::endl;

   return 0;
}