[Insight-users] converting mesh to binary image

Luis Ibanez luis.ibanez at kitware.com
Wed Dec 31 13:17:49 EST 2008


Hi Moti,

Please print out the values of:

      orgSpacing
      orgOrigin
      orgSize
      orgIndex

just before you pass them to the meshFilter.

It is likely that the values in "orgSize" are zeros.


Please let us know what you find.


      Thanks


      Luis


---------------------
Moti Freiman wrote:
> Hi,
> I'm trying to convert a 3d surface (got as some segmentation result) to 
> a binary image, for comparison between different segmentations.
> I build a mesh from points and triangles which I got and save it as a 
> vtk polygonal data. It performs well and I can visualize it properly 
> using paraview.
> However, when I'm trying to convert it to a 3D binary volume using 
> itkTriangleMeshToBinaryImageFilter I got the following exception:
>  
> ------------------------------------------------------ start of output 
> -------------------------------------------------------------------------
> ExceptionObject caught !
> 
> itk::ExceptionObject (012CFB38)
> Location: "void __thiscall itk::TriangleMeshToBinaryImageFilter<class 
> itk::Mesh<unsigned char,3,class itk::DefaultStaticMeshTraits<unsigned 
> char,3,3,float,float,unsigned char> >,class itk::Image<unsigned char,3> 
>  >::GenerateData(void)"
> File: 
> e:\libs\insighttoolkit-3.10.0\code\basicfilters\itkTriangleMeshToBinaryImageFilter.txx
> Line: 224
> Description: itk::ERROR: TriangleMeshToBinaryImageFilter(038FD670): No 
> Image Indices Found.
> 
> 
> Press any key to continue
> 
> 
> 
> ------------------------------------------------------- end of output 
> -------------------------------------------------------------------------
> 
> My code is below,
> 
> ------------------------------------------------------ start of 
> code-------------------------------------------------------------------------
> #include "itkVTKPolyDataWriter.h"
> #include "itkVTKPolyDataReader.h"
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
> #include "itkCastImageFilter.h"
> 
> 
> #include "itkMesh.h"
> #include "itkTriangleCell.h"
> #include <fstream>
> 
> 
> #include "itkTriangleMeshToBinaryImageFilter.h"
> 
> 
> 
> int main( int argc, char **argv )
> {   
>     char *points_name = NULL, *faces_name = NULL, *output_mesh = NULL,  
> *input_image = NULL, *output_name = NULL;
>    
> 
>    
> 
>     points_name  = argv[1];
>     faces_name = argv[2];
>     output_mesh  = argv[3];
>     input_image = argv[4];
>     output_name = argv[5];
>    
> 
>     typedef short PixelType;
>     typedef unsigned char OutputPixelType;
>     const unsigned int          Dimension = 3;
> 
>    
>     typedef itk::Mesh <OutputPixelType, Dimension> itkMeshType;
> 
>     itkMeshType::Pointer mesh = itkMeshType::New();
>    
>    
>    
>     std::fstream pointsReader;
>     pointsReader.open (points_name, std::ios::in);
>     int i=0;
>     while (pointsReader.peek () != EOF)
>     {
>         itkMeshType::PointType p;
>         pointsReader >> p[0] >> p[1] >> p[2];
>         mesh->SetPoint (i,p);
>         ++i;
>     }
>     pointsReader.close();
>    
>     typedef itkMeshType::CellType CellType;
>     typedef itk::TriangleCell < CellType > FaceType;
> 
>     typedef CellType::CellAutoPointer CellAutoPointer;
> 
> 
> 
>     std::fstream facesReader;
>     facesReader.open (faces_name, std::ios::in);
>    
>     i=0;
>     while (facesReader.peek () != EOF)
>     {
>         int p[3];
>         facesReader >> p[0] >> p[1] >> p[2];
>        
>         CellAutoPointer face;
>         face.TakeOwnership( new FaceType );
> 
>         face->SetPointId (0, p[0]);
>         face->SetPointId (1, p[1]);
>         face->SetPointId (2, p[2]);
> 
>         mesh->SetCell (i,face);
>         ++i;
>     }
>     facesReader.close();
>     mesh->Update();
> 
>    
> 
>    
> 
>    
>     typedef itk::VTKPolyDataWriter<itkMeshType> itkVTKPolyDataWriterType;
> 
>     itkVTKPolyDataWriterType::Pointer meshWriter = 
> itkVTKPolyDataWriterType::New();
>     meshWriter->SetFileName( output_mesh );
>     meshWriter->SetInput (mesh);
>     try
>     {
>         meshWriter->Update();
>     }
>     catch ( itk::ExceptionObject &err)
>     {
>         std::cout << "ExceptionObject caught !" << std::endl;
>         std::cout << err << std::endl;
>         return -1;
>     }
> 
>    
> 
> 
>     typedef itk::Image< PixelType, Dimension > ImageType;
>     typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
>    
>     typedef itk::ImageFileReader< ImageType > ImageReaderType;
> 
> 
> 
> 
> 
>     // Read the input files
>     ImageReaderType::Pointer reader = ImageReaderType::New();
>     reader->SetFileName( input_image );
>     try
>     {
>         reader->Update();
>     }
>     catch ( itk::ExceptionObject &err)
>     {
>         std::cout << "ExceptionObject caught !" << std::endl;
>         std::cout << err << std::endl;
>         return -1;
>     }
> 
>    
> 
>     ImageType::Pointer orgImage = reader->GetOutput();
>    
>     const ImageType::PointType & orgOrigin = orgImage->GetOrigin();
>     const ImageType::SizeType & orgSize = 
> orgImage->GetLargestPossibleRegion().GetSize();
>     const ImageType::SpacingType & orgSpacing = orgImage->GetSpacing();
>     const ImageType::IndexType &orgIndex = 
> orgImage->GetLargestPossibleRegion().GetIndex();
>    
>    
>    
> 
> 
>     typedef itk::TriangleMeshToBinaryImageFilter <itkMeshType, 
> OutputImageType> itkTriangleMeshToBinaryImageFilterType;
>     itkTriangleMeshToBinaryImageFilterType::Pointer meshFilter = 
> itkTriangleMeshToBinaryImageFilterType::New();
>     meshFilter->SetTolerance (1.0);
>     meshFilter->SetSpacing (orgSpacing);
>     meshFilter->SetOrigin(orgOrigin);
>     meshFilter->SetSize (orgSize);
>     meshFilter->SetIndex (orgIndex);
>     meshFilter->SetInput(mesh);
>    
>    
>     try
>     {
>         meshFilter->Update();
>     }
>     catch ( itk::ExceptionObject &err )
>     {
>         std::cout << "ExceptionObject caught !" << std::endl;
>         std::cout << err << std::endl;
>         return -1;
>     }
>    
>    
>    
>    
>     // Write the output image containing the binary volume.
>     typedef itk::ImageFileWriter< OutputImageType > WriterType;
>     WriterType::Pointer writer = WriterType::New();
>     writer->SetInput( meshFilter->GetOutput() );
>     writer->SetFileName( output_name );
>     try
>     {
>         writer->Update();
>     }
>     catch ( itk::ExceptionObject &err )
>     {
>         std::cout << "ExceptionObject caught !" << std::endl;
>         std::cout << err << std::endl;
>         return -1;
>     }
> 
>     return 0;   
> }
> 
> ------------------------------------------------------ end of 
> code-------------------------------------------------------------------------
> 
> Thanks for any help,
> Moti
> -- 
> __
> Moti Freiman, Ph.D Student.
> Medical Image Processing and Computer-Assisted Surgery Laboratory.
> School of Computer Science and Engineering.
> The Hebrew University of Jerusalem Givat Ram, Jerusalem 91904, Israel
> Phone: +(972)-2-658-5371 (laboratory)
> WWW site: http://www.cs.huji.ac.il/~freiman
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users


More information about the Insight-users mailing list