<br><br><div class="gmail_quote">On Sun, Aug 16, 2009 at 9:58 PM, Luis Ibanez <span dir="ltr">&lt;<a href="mailto:luis.ibanez@kitware.com">luis.ibanez@kitware.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>Hi Motes,<br><br>Integrating this into the registration process is straightforward.<br><br>The ThinPlateSpline is a Transform, so you just need to connect it<br>to the RegistrationMethod in the same way that you would have <br>

used an AffineTransform or a BSplineDeformableTransform.<br><br>The only caveat is that you should use Optimizers that do not <br>require derivatives, for example:<br><br><ul><li>AmoebaOptimizer or<br></li><li>OnePlusOneEvolutionaryOptimizer</li>

</ul><br>This is because the ThinPlateSpline transforms have not <br>implemented yet the methods that compute Jacobians.<br><br></blockquote><div><br><br>Thanks for the tip, I will see if I can get a test up and running!<br>
<br><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>---<br><br>Your approach for implementing a BSplineDeformableTransform<br>
that also moves the Nodes, can easily be achieved by combining<br>
two BSplineDeformableTransforms, both of them with the same<br>number of Nodes. The first transform could be used for representing<br>the locations of the nodes of the second transform, while the second<br>transform represents deformation vectors in the usual BSpline context.<br>

<br>You could put these two transforms together inside a new Transform<br>class, and then plug that larger transform class into the Registration<br>framework.<br></blockquote><div><br><br>Ok you pretty much lost me with that recipe, I  think I need an example to understand. <br>
<br>You mention that both transforms have the same number of nodes, but as I wrote earlier I would like to add/remove nodes in the future. How well would the above approach work with this extension?</div><div><br><br>I have tried walking through a registration example using the BSplineDeformableTransform. In each iteration the most important calls as I understand are:<br>
<br>ResumeOptimization(void)<br>          |-----&gt; GetValueAndDerivative()<br>          |-----&gt; AdvanceOneStep()<br>                         |-----&gt; StepAlongGradient()<br><br>where:<br><br>1) ResumeOptimization<br>
RegularStepGradientDescentBaseOptimizer::ResumeOptimization( void )<br><br>[+]    Calls the above functions in each interation.<br><br><br><br>2) GetValueAndDerivative<br>MeanSquaresImageToImageMetric&lt;TFixedImage,TMovingImage&gt;::GetValueAndDerivative(const TransformParametersType &amp; parameters,                          MeasureType &amp; value, DerivativeType  &amp; derivative) const<br>
<br>[+]    Here the metric is computed. The similarity measure value between the fixed and transformed moving image.<br><br><br><br>3) AdvanceOneStep<br>RegularStepGradientDescentBaseOptimizer::AdvanceOneStep( void )<br><br>
[+]    The transformed gradient is computed.<br><br><br><br><br>4) StepAlongGradient<br>RegularStepGradientDescentOptimizer::StepAlongGradient( double factor,  const DerivativeType &amp; transformedGradient )<br><br>[+]    Given the transformed gradient the new deformation vectors (direction/magnitude) are computed:<br>
<br>  ParametersType newPosition( spaceDimension );<br>  for(unsigned int j=0; j&lt;spaceDimension; j++)<br>    {<br>    newPosition[j] = currentPosition[j] + transformedGradient[j] * factor;<br>    }<br><br><br><br><br>----------------------------------------------------<br>
<br>But in which of the above steps are the location of the deformation vectors read/used? I would say that they would be needed in step 3) but from the code it does not appear so.<br><br>I am still having difficulty understand the relation between what happens in each iteration and the location of the deformation vectors.<br>
<br><br><br><br><br><br><br><br><br><br><br><br><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>      Regards,<br><br><br>              Luis<br>
<br>
<br>---------------------------------------------------------------------------------------<div><div></div><div class="h5"><br><div class="gmail_quote">On Sun, Aug 16, 2009 at 3:04 PM, motes motes <span dir="ltr">&lt;<a href="mailto:mort.motes@gmail.com" target="_blank">mort.motes@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br><br><div class="gmail_quote"><div>On Sun, Aug 16, 2009 at 5:22 PM, Luis Ibanez <span dir="ltr">&lt;<a href="mailto:luis.ibanez@kitware.com" target="_blank">luis.ibanez@kitware.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Hi Motes,<br><br><br>          &quot;Glimpsing at the source leaves no doubt&quot;<br><br><br>If you look at lines 120-130 of the ThinPlateSplineWarp.cxx file:<br><br>  while (!infile.eof())<br>    {<br>    infile &gt;&gt;  p1[0] &gt;&gt; p1[1] &gt;&gt; p1[2] &gt;&gt; p2[0] &gt;&gt; p2[1] &gt;&gt; p2[2]; <br>




<br>    sourceLandMarkContainer-&gt;InsertElement( id, p1 );<br>    targetLandMarkContainer-&gt;InsertElement( id++, p2 );<br>    } <br><br>You will see that the first three values of the file are assigned<br>to the X,Y,Z coordinates of the first source landmark, while the<br>




second group of three values is assigned to the X,Y,Z coordinates<br>of the first landmark in the group of target landmarks.<br><br><br>Note that this is different from how we manage BSplineDeformableTransforms.<br><br>In this ThinPlateSpline example there are no deformation vectors.  We use<br>




a group of landmarks in the Fixed image, that map, one-to-one, to landmarks<br>in the moving image.<br><br>The triplet ( 180  217  0 )  that you pointed out to in your email, correspond <br>indeed to the coordinates of a point in the space of the fixed image.<br>




<br>It is the point with coordinates:   X = 180.0, Y = 217.0,  Z = 0.0<br>
<br><br>     Regards,<br><br><br>            Luis<br><br></blockquote></div><div><br><br><br><br><br>Ok that makes sense, but how would that be used in a registration context eg. connecting the ThinplateSpline to an optimizer? <br>



<br>The source and target landmarks are choosen manually in the example but I am working on a project where this is not possible and the registration process should run automatically.<br><br><br><br>I am therefore still pretty interested in using the BSplineDeformationTransform, but I am still stuck with how to create a non-uniform grid of deformation vectors - if this is even possible with the current implementation?<br>


<br>
<br>Assume that I have defined a 5*5 grid of deformation vectors. Now I want the deformation vector at location (2,3) to be located at another location, how would that be possible?<br><br><br>As I understand the only way to create a non-uniform location of deformation vectors is to change the spacing. But that will only result in non-uniform spacing arcross dimesions and not within each of the dimesions.<br>


<br>Am I walking down a dark and lonely path trying to make the current BSplineDeformationTransform more flexible?<br><br><br><br><br><br><br><br><br><br><br><br> </div><div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">



<br>--------------------------------------------------------------------------------------------<br><div class="gmail_quote"><div><div></div><div>On Sun, Aug 16, 2009 at 2:10 AM, motes motes <span dir="ltr">&lt;<a href="mailto:mort.motes@gmail.com" target="_blank">mort.motes@gmail.com</a>&gt;</span> wrote:<br>




</div></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div>In the ThinPlateSplineWarp.cxx a set of landmarks are read from the file LandmarkWarping3Landmarks1.txt which contains this:<br>




<br>  0   0   0        0   0      0<br>180   0   0      180   0      0<br>180 217   0      180 217      0<br>
  0 217   0        0 217      0<br>  0   0 180        0   0    180<br>180   0 180      180   0    180<br>180 217 180      180 217    180<br>  0 217 180        0 217    180<br> 90 108  90       90 130     90<br><br><br><br>





As I understand these are 18 landmark points which is actually just deformation vectors. So the 3 first values in the third row:<br><br>180  217  0<br><br>corresponds to a vector at some location pointing 180 unit in the x-direction and 217 units in the y-direction.<br>





<br>But where in the image is this vector located?<br><br>Or are the above landmarks just &#39;regular&#39; points that are interpolated by the ThinPlateSpline and not deformation vectors?<br><br><br>
<br></div></div>_____________________________________<br>
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at<br>
<a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the ITK FAQ at: <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
<br></blockquote></div><br>
</blockquote></div></div><br>
</blockquote></div><br>
</div></div></blockquote></div><br>