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