[Insight-users] How to properly use itkTriangleMeshToImageFilter?
Maarten Beek
mbeek at sri.utoronto.ca
Fri Jul 3 13:43:33 EDT 2009
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