<div dir="ltr"><div>Mat, thank you very much for your answer, my code seems to be working and it looks like this:<br><br></div><div>I had some additional problems with the itk::DisplacementFieldTransform class when trying to use it with floats but things seem to be working with doubles. I do not include yet the inversion of the deformation fields that Brian suggested but I am pretty confident I can add it without many more problems.<br>
<br></div><div>I am including the code in case anyone is interested, please note that it is in no way tested (I will update it if I find major problems with it).<br></div><div><br></div><div>Thanks for your help.<br></div>
<div>Yago<br><br></div><div><br><br></div>CODE TO DEFORM A POINT WITH AN ITK FORMATTED DEFORMATION FIELD (ITK4)<br><div><div><br>#include &quot;itkCompositeTransform.h&quot;<br>#include &quot;itkDisplacementFieldTransform.h&quot;<br>
#include &quot;itkImageFileReader.h&quot;<br><br>#include&lt;iostream&gt;<br>#include &lt;itkVector.h&gt;<br>#include &lt;itkImage.h&gt;<br><br>using namespace std;<br> <br>int main( int argc, char * argv [] )<br>{<br>  if( argc &lt; 3 )<br>
    {<br>    std::cerr &lt;&lt; &quot;Missing command line arguments&quot; &lt;&lt; std::endl;<br>    std::cerr &lt;&lt; &quot;Usage :  DeformationFieldFile pointX pointY pointZ&quot;;<br>    return -1;<br>    }<br><br><br>
  typedef double      PixelType;<br>  typedef double VectorComponentType;<br><br>  const   unsigned int        Dimension = 3;<br><br>    typedef itk::Vector&lt; PixelType, Dimension  &gt; VectorPixelType;<br>     typedef itk::Image&lt; VectorPixelType, Dimension &gt; DeformationFieldType;<br>
     typedef itk::ImageFileReader&lt; DeformationFieldType &gt; ReaderType;<br><br><br>     ReaderType::Pointer reader = ReaderType::New();<br><br>     reader-&gt;SetFileName(argv[1]);<br><br>     reader-&gt;Update();<br>
<br>     DeformationFieldType::Pointer deffield = reader-&gt;GetOutput();<br><br> <br>    typedef itk::DisplacementFieldTransform&lt;VectorComponentType, 3&gt;  DisplacementFieldTransformType;<br><br>    DisplacementFieldTransformType::Pointer displacementFieldTransform = DisplacementFieldTransformType::New();<br>
    displacementFieldTransform-&gt;SetDisplacementField( reader-&gt;GetOutput() );<br><br> <br>// read the point to be transformed<br>   itk::Point&lt;double,3&gt; p0,p1;
<br>   p0[0] = atof(argv[2]);
<br>   p0[1] = atof(argv[3]);
<br>   p0[2] = atof(argv[4]);    <br><br><br>    typedef itk::CompositeTransform&lt;double, Dimension&gt; CompositeTransformType;<br>    typename CompositeTransformType::InputPointType point_in;<br>    typename CompositeTransformType::OutputPointType point_out;<br>
<br>    typename CompositeTransformType::Pointer compositeTransform = CompositeTransformType::New();<br>    compositeTransform-&gt;AddTransform( displacementFieldTransform);<br><br>     p1=compositeTransform-&gt;TransformPoint( p0 );<br>
<br><br>//cout&lt;&lt;&quot;initial point &quot;&lt;&lt;&quot;p0 &quot;&lt;&lt;p0&lt;&lt;&quot;p1 &quot;&lt;&lt;compositeTransform-&gt;TransformPoint( p0 )&lt;&lt;endl;<br>cout&lt;&lt;p1[0]&lt;&lt;&quot; &quot;&lt;&lt;p1[1]&lt;&lt;&quot; &quot;&lt;&lt;p1[2]&lt;&lt;endl;<br>
<br><br>  return 0;<br>  <br>}<br><br></div></div></div><div class="gmail_extra"><br clear="all"><div><div dir="ltr">Yago Diez Donoso (PhD)<br>Computer Vision and Robotics Group <a href="http://vicorob.udg.es/" target="_blank">http://vicorob.udg.es/</a><br>
E-mail: <a href="mailto:yago@eia.udg.es" target="_blank">yago@eia.udg.es</a>; <a href="mailto:yagodiezdonoso@gmail.com" target="_blank">yagodiezdonoso@gmail.com</a><br>Phone: (int. code) 34 972418013<br>University of Girona </div>
</div>
<br><br><div class="gmail_quote">On Sat, Dec 7, 2013 at 6:23 PM, Matt McCormick <span dir="ltr">&lt;<a href="mailto:matt.mccormick@kitware.com" target="_blank">matt.mccormick@kitware.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Yago,<br>
<br>
An Image that defines the displacement field vectors can be set on a<br>
DisplacementFieldTransfrom with SetDisplacementFieldTransform [1].  It<br>
is also possible to save the displacement field as a transform<br>
directly, instead of an image, with the TransformFileWriter [2].<br>
<br>
Hope this helps,<br>
Matt<br>
<br>
[1] <a href="http://www.itk.org/Doxygen/html/classitk_1_1DisplacementFieldTransform.html#ab0b5ac8b6792ed0acddbd0a6666b39d2" target="_blank">http://www.itk.org/Doxygen/html/classitk_1_1DisplacementFieldTransform.html#ab0b5ac8b6792ed0acddbd0a6666b39d2</a><br>

[2] <a href="http://www.itk.org/Doxygen/html/classitk_1_1TransformFileWriterTemplate.html" target="_blank">http://www.itk.org/Doxygen/html/classitk_1_1TransformFileWriterTemplate.html</a><br>
<div><div class="h5"><br>
On Sat, Dec 7, 2013 at 10:48 AM, Yago Diez &lt;<a href="mailto:yagodiezdonoso@gmail.com">yagodiezdonoso@gmail.com</a>&gt; wrote:<br>
&gt; First of all, thanks a lot for your answer and sorry I couldn&#39;t solve the<br>
&gt; problem on my own. I have been fighting for a while with this but so far I<br>
&gt; have not had much success. At least I am now a bit more aware of how many<br>
&gt; things I don&#39;t know.<br>
&gt;<br>
&gt; First of all, I realise what I want to do boils down to :<br>
&gt;<br>
&gt; typename CompositeTransformType::Pointer compositeTransform =<br>
&gt; CompositeTransformType::New();<br>
&gt; compositeTransform-&gt;AddTransform( deffield);<br>
&gt; compositeTransform-&gt;TransformPoint( p0 );<br>
&gt;<br>
&gt; The problem now is that my deformation field is not recognised as a valid<br>
&gt; transformation.<br>
&gt;<br>
&gt; My deformation field which is the output of demons registration and it is<br>
&gt; stored in a file in mha format. I read it like this (as a vector image as<br>
&gt; used to be done in itk3):<br>
&gt;<br>
&gt;&gt;  typedef float      PixelType;<br>
&gt;&gt;  typedef   float VectorComponentType;<br>
&gt;&gt;<br>
&gt;&gt;   const   unsigned int        Dimension = 3;<br>
&gt;&gt;<br>
&gt;&gt;  typedef itk::Vector&lt; PixelType, Dimension  &gt; VectorPixelType;<br>
&gt;&gt;  typedef itk::Image&lt; VectorPixelType, Dimension &gt; DeformationFieldType;<br>
&gt;&gt;  typedef itk::ImageFileReader&lt; DeformationFieldType &gt; ReaderType;<br>
&gt;&gt;<br>
&gt;&gt;  ReaderType::Pointer reader = ReaderType::New();<br>
&gt;&gt;  reader-&gt;SetFileName(argv[1]);<br>
&gt;&gt;  reader-&gt;Update();<br>
&gt;&gt;  DeformationFieldType::Pointer deffield = reader-&gt;GetOutput();<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; When I try to add it to the composite transform, however, I get the error:<br>
&gt;<br>
&gt; /media/disc4/code/newTransformPoints.cxx:112:47: error: no matching function<br>
&gt; for call to ‘itk::CompositeTransform&lt;float,<br>
&gt; 3u&gt;::AddTransform(itk::Image&lt;itk::Vector&lt;float, 3u&gt;, 3u&gt;::Pointer&amp;)’<br>
&gt; /media/disc4/code/newTransformPoints.cxx:112:47: note: candidate is:<br>
&gt; /usr/local/include/ITK-4.4/itkMultiTransform.h:145:16: note: void<br>
&gt; itk::MultiTransform&lt;TScalar, NDimensions,<br>
&gt; NSubDimensions&gt;::AddTransform(itk::MultiTransform&lt;TScalar, NDimensions,<br>
&gt; NSubDimensions&gt;::TransformType*) [with TScalar = float, unsigned int<br>
&gt; NDimensions = 3u, unsigned int NSubDimensions = 3u,<br>
&gt; itk::MultiTransform&lt;TScalar, NDimensions, NSubDimensions&gt;::TransformType =<br>
&gt; itk::Transform&lt;float, 3u, 3u&gt;]<br>
&gt; /usr/local/include/ITK-4.4/itkMultiTransform.h:145:16: note:   no known<br>
&gt; conversion for argument 1 from ‘itk::Image&lt;itk::Vector&lt;float, 3u&gt;,<br>
&gt; 3u&gt;::Pointer {aka itk::SmartPointer&lt;itk::Image&lt;itk::Vector&lt;float, 3u&gt;, 3u&gt;<br>
&gt;&gt;}’ to ‘itk::MultiTransform&lt;float, 3u, 3u&gt;::TransformType* {aka<br>
&gt; itk::Transform&lt;float, 3u, 3u&gt;*}’<br>
&gt;<br>
&gt;<br>
&gt; From what I understand, instead of reading my deformation field as a vector<br>
&gt; image, I should probably be using the itk4 &quot;displacementfieldtransform&quot;.<br>
&gt;<br>
&gt;&gt; typedef itk::DisplacementFieldTransform&lt;VectorComponentType, 3&gt;<br>
&gt;&gt; DeformationFieldTransformType;<br>
&gt;<br>
&gt;<br>
&gt; My main problem now is that I cannot seem to &quot;connect&quot; my mha file<br>
&gt; containing the deformation field with the displacementFieldTransformType. I<br>
&gt; probably need some type of basic &quot;read DisplacementFieldTransform from file&quot;<br>
&gt; function, but so far I have not been able to make one.<br>
&gt;<br>
&gt; Any ideas that might help? I realise that the bigger problem here is my own<br>
&gt; lack of knowledge on the details of itk4, so please do not hesitate to point<br>
&gt; me to as basic a source as necessary.<br>
&gt; Gratefully<br>
&gt; Yago Diez Donoso<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Yago Diez Donoso (PhD)<br>
&gt; Computer Vision and Robotics Group <a href="http://vicorob.udg.es/" target="_blank">http://vicorob.udg.es/</a><br>
&gt; E-mail: <a href="mailto:yago@eia.udg.es">yago@eia.udg.es</a>; <a href="mailto:yagodiezdonoso@gmail.com">yagodiezdonoso@gmail.com</a><br>
&gt; Phone: (int. code) 34 972418013<br>
&gt; University of Girona<br>
&gt;<br>
&gt;<br>
&gt; On Wed, Dec 4, 2013 at 8:48 PM, brian avants &lt;<a href="mailto:stnava@gmail.com">stnava@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; see line 142 here:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; <a href="https://github.com/stnava/ANTs/blob/d99d9c9e23ae17c116377a248cd370ddbd8c2599/Examples/antsApplyTransformsToPoints.cxx" target="_blank">https://github.com/stnava/ANTs/blob/d99d9c9e23ae17c116377a248cd370ddbd8c2599/Examples/antsApplyTransformsToPoints.cxx</a><br>

&gt;&gt;<br>
&gt;&gt; you can do the same thing in your application but note that the<br>
&gt;&gt; deformation field , when applied to a point , should be the inverse of the<br>
&gt;&gt; deformation field applied to an image<br>
&gt;&gt;<br>
&gt;&gt; see my previous email regarding SyN and inverse warps.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; brian<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Dec 4, 2013 at 2:33 PM, Yago Diez &lt;<a href="mailto:yagodiezdonoso@gmail.com">yagodiezdonoso@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Hi everyone,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I have a problem regarding itk deformation fields:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Specifically, I want to know where a particular point ends up after<br>
&gt;&gt;&gt; registration. Said registration has produced a deformation field. I have<br>
&gt;&gt;&gt; already used this deformation field to deform the source image and produce<br>
&gt;&gt;&gt; the output image for registration (this was done using itkWarpImageFilter).<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; My problem is that at this moment I only want to transform one point. The<br>
&gt;&gt;&gt; obvious solution was to read the corresponding voxel in the deformation<br>
&gt;&gt;&gt; field and add it to the point, but the problem is that the deformation field<br>
&gt;&gt;&gt; is not &quot;dense enough&quot;, so in most cases, the read deformation for a point<br>
&gt;&gt;&gt; ends up being zero (see attached image for a screen capture of a 2D slice of<br>
&gt;&gt;&gt; my 3D deformation field).<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;  I have noticed how when I deform an image with itkWarpImageFilter, there<br>
&gt;&gt;&gt; is an &quot;extra&quot; interpolation step which would avoid the problem I am having,<br>
&gt;&gt;&gt; but so far I have not been able to interpolate a deformation field. Any<br>
&gt;&gt;&gt; ideas on how to do that?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Thank you<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Yago Diez Donoso (PhD)<br>
&gt;&gt;&gt; Computer Vision and Robotics Group <a href="http://vicorob.udg.es/" target="_blank">http://vicorob.udg.es/</a><br>
&gt;&gt;&gt; E-mail: <a href="mailto:yago@eia.udg.es">yago@eia.udg.es</a>; <a href="mailto:yagodiezdonoso@gmail.com">yagodiezdonoso@gmail.com</a><br>
&gt;&gt;&gt; Phone: (int. code) 34 972418013<br>
&gt;&gt;&gt; University of Girona<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _____________________________________<br>
&gt;&gt;&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Visit other Kitware open-source projects at<br>
&gt;&gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt;&gt;&gt; <a href="http://www.kitware.com/products/protraining.php" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt;&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt; _____________________________________<br>
&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;<br>
&gt; Visit other Kitware open-source projects at<br>
&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>
&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt; <a href="http://www.kitware.com/products/protraining.php" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
&gt;<br>
&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;<br>
&gt; Follow this link to subscribe/unsubscribe:<br>
&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Community mailing list<br>
&gt; <a href="mailto:Community@itk.org">Community@itk.org</a><br>
&gt; <a href="http://public.kitware.com/cgi-bin/mailman/listinfo/community" target="_blank">http://public.kitware.com/cgi-bin/mailman/listinfo/community</a><br>
&gt;<br>
</blockquote></div><br></div>