[Insight-users] How to properly use itkTriangleMeshToImageFilter?

Amardeep Singh amar.singh at gmx.de
Fri Jul 3 13:57:56 EDT 2009


Aha, cool! I did not know about this filter. I will have a proper look, 
but it looks good :)
Thanks!

Amar

Maarten Beek wrote:
> What about : |itkShapedNeighborhoodIterator? 
> <http://www.itk.org/Doxygen310/html/itkShapedNeighborhoodIterator_8h-source.html>| 
>
>
> Amardeep Singh wrote:
>> Dear Luis
>>
>> Thank you very much for your quick reply.
>>
>> What I actually want to do is iterate over a part of my image and 
>> extract a circular neighborhood
>> at every point and postprocess these extracted circles. Using the 
>> itkMesh was a first try to get
>> the circular neighborhood. However, I think it might be too slow for 
>> my task as it would be applied very frequently.
>> So, I need to come up with something else, anyway, I guess. Any ideas?
>>
>> I added the following line to my code:
>> reader->GetOutput()->TransformIndexToPhysicalPoint(idx, center);
>>
>> where "idx" is the Index in my image where I want my sphere to be and 
>> "center" is the center of the sphere (RegularSphereMeshSource).
>> Like this, I manage to place the sphere where I want it to be. I was 
>> not aware that the center is set in world coordinates.
>> Thanks a lot for your help!
>>
>> Best regards
>> Amardeep
>>
>> Luis Ibanez wrote:
>>>
>>> Hi Amardeep,
>>>
>>> I think that this typically happens when the image parameters
>>> are such that the image is not overlapping with your input mesh
>>> in Physical space.
>>>
>>>
>>> You should choose the
>>>
>>>     * Origin
>>>     * Spacing
>>>     * Number of pixels
>>>
>>> of you image to create a grid on top of the Physical space that
>>> is occupied by the Mesh.
>>>
>>> Have you looked at your Mesh, and found the bounds of the
>>> mesh nodes in space ?
>>>
>>> Can you please post to the mailing list what the BoundingBox
>>> of your mesh is ?
>>>
>>> These values can be used to select proper parameters for the
>>> output image that contains the rasterization of the Mesh.
>>>
>>>
>>> The image parameters should match the extent of the input Mesh,
>>> not the extent of an image that you read from disk. Unless your
>>> Mesh was extracted from that image that you are reading from
>>> disk...
>>>
>>>
>>>
>>> You could get a feeling for these parameters by loading your
>>> Mesh into ParaView (or any other visualization tool).
>>>
>>>
>>>     Please let us know,
>>>
>>>
>>>        Thanks
>>>
>>>
>>>             Luis
>>>
>>>
>>> -------------------------------------------------------------------------------- 
>>>
>>> On Thu, Jul 2, 2009 at 3:34 PM, Amardeep Singh <amar.singh at gmx.de 
>>> <mailto:amar.singh at gmx.de>> wrote:
>>>
>>>     Dear ITK Users
>>>
>>>     I would like to use the "itkTriangleMeshToImageFilter". In a first
>>>     experiment, I just want to create
>>>     a sphere using the "itkRegularSphereMeshSource", binarize it and
>>>     save the output. I take the size, origin and spacing
>>>     of the resulting image from an image that I read from the harddisk
>>>     (just for convenience).
>>>     Unfortunately, I get the following error:
>>>
>>>     Start Processing!
>>>     [-90, 126, -72]          <--- origin
>>>     [182, 218, 182]        <--- size of image
>>>     [1, 1, 1]                    <--- spacing of image
>>>     [0, 0, 0]                    <--- index
>>>     Exception caught !
>>>
>>>     itk::ExceptionObject (0x81a3b00)
>>>     Location: "void itk::TriangleMeshToBinaryImageFilter<TInputMesh,
>>>     TOutputImage>::GenerateData() [with TInputMesh = itk::Mesh<float,
>>>     3u, itk::DefaultStaticMeshTraits<float, 3u, 3u, float, float,
>>>     float> >, TOutputImage = itk::Image<unsigned char, 3u>]"
>>>     File:
>>>     
>>> /workspace/InsightToolkit-3.14.0/Code/BasicFilters/itkTriangleMeshToBinaryImageFilter.txx 
>>>
>>>     Line: 224
>>>     Description: itk::ERROR:
>>>     TriangleMeshToBinaryImageFilter(0x8141ec8): No Image Indices Found.
>>>
>>>     Above, I have included output, indicating the origin, size,
>>>     spacing and index of the largest region of the image that I read
>>>     from the harddisk. These are the values that I pass to the
>>>     "itkTriangleMeshToImageFilter", so they should be fine, I think.
>>>     There has been a similar posting on the mailing list
>>>     
>>> ("http://www.nabble.com/converting-mesh-to-binary-image-td21170657.html"), 
>>>
>>>     but the solution to the problem was not made explicit,
>>>     unfortunately. Please, find my source code attached.
>>>     Does anyone know how to resolve this problem?
>>>     Thank you very much!
>>>
>>>     Best regards
>>>     Amardeep
>>>
>>>
>>>     #include "itkImageRegionIterator.h"
>>>     #include "itkImageFileReader.h"
>>>     #include "itkImageFileWriter.h"
>>>     #include "itkTriangleMeshToBinaryImageFilter.h"
>>>     #include "itkDefaultStaticMeshTraits.h"
>>>     #include "itkMesh.h"
>>>     #include "itkRegularSphereMeshSource.h"
>>>
>>>     #include "iostream"
>>>
>>>
>>>     int main(int argc, char *argv[] )
>>>     {
>>>       std::cout << "Start Processing!" << std::endl;
>>>
>>>       typedef unsigned char BinaryPixelType;
>>>       typedef float PixelType;
>>>       typedef itk::DefaultStaticMeshTraits<float, 3, 3,float,float>
>>>     TriangleMeshTraits;
>>>       typedef itk::Mesh<float,3, TriangleMeshTraits> TriangleMeshType;
>>>       typedef itk::RegularSphereMeshSource<TriangleMeshType>
>>>      SphereMeshSourceType;
>>>       typedef SphereMeshSourceType::PointType PointType;
>>>
>>>       typedef itk::Image<BinaryPixelType, 3>      BinaryImageType;
>>>       typedef itk::Image<PixelType, 3> ImageType;
>>>
>>>       typedef itk::TriangleMeshToBinaryImageFilter<TriangleMeshType,
>>>     BinaryImageType> TriangleMeshToBinaryImageFilterType;
>>>
>>>            TriangleMeshToBinaryImageFilterType::Pointer 
>>> triangleMeshToImage
>>>     = TriangleMeshToBinaryImageFilterType::New();
>>>       SphereMeshSourceType::Pointer sphere = 
>>> SphereMeshSourceType::New();
>>>       sphere->SetScale(5);
>>>       sphere->SetResolution(5);
>>>
>>>       typedef itk::ImageFileReader<ImageType> ReaderType;
>>>       typedef itk::ImageFileWriter<BinaryImageType> WriterType;
>>>
>>>       ReaderType::Pointer reader = ReaderType::New();
>>>       reader->SetFileName("/test_image.nii.gz");
>>>       try
>>>       {
>>>         reader->Update();
>>>       }
>>>       catch( itk::ExceptionObject & excep )
>>>       {
>>>         std::cerr << "Exception caught !" << std::endl;
>>>         std::cerr << excep << std::endl;
>>>       }
>>>
>>>       PointType center;
>>>       center[0] = 10;
>>>       center[1] = 10;
>>>       center[2] = 10;
>>>       sphere->SetCenter(center);
>>>       triangleMeshToImage->SetInput(sphere->GetOutput());
>>>
>>>       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();
>>>
>>>       std::cout << orgOrigin << std::endl;
>>>       std::cout << orgSize << std::endl;
>>>       std::cout << orgSpacing << std::endl;
>>>       std::cout << orgIndex << std::endl;
>>>
>>>       triangleMeshToImage->SetTolerance (1.0);
>>>       triangleMeshToImage->SetSpacing (orgSpacing);
>>>       triangleMeshToImage->SetOrigin(orgOrigin);
>>>       triangleMeshToImage->SetSize (orgSize);
>>>       triangleMeshToImage->SetIndex (orgIndex);
>>>
>>>       WriterType::Pointer writer = WriterType::New();
>>>
>>>       writer->SetFileName("/test_output.nii.gz");
>>>       writer->SetInput(triangleMeshToImage->GetOutput());
>>>
>>>       try
>>>       {
>>>           sphere->Update();
>>>           triangleMeshToImage->Update();
>>>           writer->Update();
>>>       }
>>>       catch( itk::ExceptionObject & excep )
>>>       {
>>>         std::cerr << "Exception caught !" << std::endl;
>>>         std::cerr << excep << std::endl;
>>>       }
>>>
>>>       return 0;
>>>
>>>     }
>>>
>>>
>>>
>>>
>>>
>>>     _____________________________________
>>>     Powered by www.kitware.com <http://www.kitware.com>
>>>
>>>     Visit other Kitware open-source projects at
>>>     http://www.kitware.com/opensource/opensource.html
>>>
>>>     Please keep messages on-topic and check the ITK FAQ at:
>>>     http://www.itk.org/Wiki/ITK_FAQ
>>>
>>>     Follow this link to subscribe/unsubscribe:
>>>     http://www.itk.org/mailman/listinfo/insight-users
>>>
>>>
>> _____________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the ITK FAQ at: 
>> http://www.itk.org/Wiki/ITK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.itk.org/mailman/listinfo/insight-users
>


More information about the Insight-users mailing list