<br>Hi Luis,<br><br>Thank you for taking the time to look over this code so closely (your quick response has allowed me to move on with the work today).<br><br>This is a question about replacing a section of BSplineTransform init code with the helper class to do that, as discussed in <a href="http://hdl.handle.net/1926/1338">http://hdl.handle.net/1926/1338</a><br>
<br>Below is a section of code that uses the helper class and comments out previous init code to define the BSpline grid parameters.  Does it do this correctly?<br><br><font size="1"><span style="font-family: courier new,monospace;">    typedef itk::BSplineDeformableTransform&lt; CoordinateRepType, SpaceDimension, SplineOrder &gt; bsTransformType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    bsTransformType::Pointer bsTransform = bsTransformType::New();</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // Use the itk::BSplineDeformableTransformInitializer to simplify</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    // initialization of the grid parameters for the itk::BSplineDeformableTranform.</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // It will ensure that no small detail is missed in the process.</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    typedef itk::BSplineDeformableTransformInitializer&lt; bsTransformType, bwInputImageType &gt; bsInitializerType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    bsInitializerType::Pointer bsTransformInitilizer = bsInitializerType::New();</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    bsTransformInitilizer-&gt;SetTransform( bsTransform );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    bsTransformInitilizer-&gt;SetImage( fixBWimg );</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    bsTransformInitilizer-&gt;SetNumberOfGridNodesInsideTheImage( 5 );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    bsTransformInitilizer-&gt;InitializeTransform();</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // BEGIN COMMENTED CODE SECTION<br>
    // Here we define the parameters of the BSplineDeformableTransform grid.  We</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // arbitrarily decide to use a grid with $5 \times 5$ nodes within the image. </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    // The reader should note that the BSpline computation requires a</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // finite support region (1 grid node at the lower borders and 2</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    // grid nodes at upper borders). Therefore in this example, we set</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // the grid size to be $8 \times 8$ and place the grid origin such that</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    // grid node (1,1) coincides with the first pixel in the fixed image.</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //typedef bsTransformType::RegionType RegionType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //RegionType::SizeType gridSizeOnImage;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //RegionType::SizeType gridBorderSize;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //RegionType::SizeType gridTotalSize;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //gridSizeOnImage.Fill( 5 );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //gridBorderSize.Fill( 3 );    // Border for spline order = 3 ( 1 lower, 2 upper )</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //gridTotalSize = gridSizeOnImage + gridBorderSize;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //RegionType gridRegion;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //gridRegion.SetSize( gridTotalSize );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //// grid spacing is based on fixed image spacing</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //bsTransformType::SpacingType gridSpacing = fixBWimg-&gt;GetSpacing();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //for(unsigned int r=0; r&lt;ImageDimension; r++)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //    {</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //    gridSpacing[r] *= static_cast&lt;double&gt;(fixBWimgSize[r] - 1)  / </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //                      static_cast&lt;double&gt;(gridSizeOnImage[r] - 1);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //    }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //// grid origin is based on fixed image origin</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //bwInputImageType::DirectionType gridDirection = fixBWimg-&gt;GetDirection();</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //bsTransformType::SpacingType gridOriginOffset = gridDirection * gridSpacing;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //bsTransformType::OriginType origin = fixBWimg-&gt;GetOrigin();</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //bsTransformType::OriginType gridOrigin = origin - gridOriginOffset;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //bsTransform-&gt;SetGridRegion( gridRegion );</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //bsTransform-&gt;SetGridOrigin( gridOrigin );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    //bsTransform-&gt;SetGridSpacing( gridSpacing );</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    //bsTransform-&gt;SetGridDirection( gridDirection );</span><br style="font-family: courier new,monospace;">
</font><font size="1"><span style="font-family: courier new,monospace;">    // END COMMENTED CODE SECTION<br>
</span></font><br style="font-family: courier new,monospace;"><font size="1"><span style="font-family: courier new,monospace;"></span><span style="font-family: courier new,monospace;"></span><span style="font-family: courier new,monospace;">    // Initialize the BSpline transform parameters.</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    typedef bsTransformType::ParametersType bsParametersType;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    const unsigned int bsNumberOfParameters = bsTransform-&gt;GetNumberOfParameters();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    bsParametersType bsParameters( bsNumberOfParameters );</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    bsParameters.Fill( 0.0 );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    bsTransform-&gt;SetParameters( bsParameters );</span><br><br style="font-family: courier new,monospace;"></font><font size="1"><span style="font-family: courier new,monospace;">    // Use the affine transform in the BSpline transform.</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    bsTransform-&gt;SetBulkTransform( affineTransform );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"></span></font><br><br>Note how the code still has a section at the end to init BSpline parameters (coefficients?).  As indicated in the IJ article source code, the helper class (itk::BSplineDeformableTransformInitializer) only sets the grid parameters on the BSpline transform, not the &quot;coefficients&quot;.  The article was published based on code in ITK 3.12.0, is this still correct for ITK 3.16.0, or does the helper class also set the &quot;coefficients&quot;?<br>
<br>Regards,<br>Darren<br><br><br><br><br><br><br><br><br><br><div class="gmail_quote">On Wed, Oct 7, 2009 at 7:34 AM, 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;">Hi Darren,<br>
<br>
After running your program in GDB, things become clearer.<br>
<br>
The problem is that in lines 621-624:<br>
<br>
    bsTransformType::Pointer bsFinalTransform = bsTransformType::New();<br>
    bsFinalTransform-&gt;SetParameters(<br>
bsRegistration-&gt;GetLastTransformParameters() );<br>
    bsFinalTransform-&gt;SetFixedParameters( bsTransform-&gt;GetFixedParameters() );<br>
<br>
You are setting the new parameters values BEFORE setting<br>
the Fixed parameters of the transform. The settings of the<br>
BSpline grid are part of the Fixed parameters. Therefore, you<br>
are passing the values of deformation to all the BSpline grid<br>
nodes, without having first specified how many grid nodes<br>
there are.<br>
<br>
The fix is simple:<br>
Invert the order of the SetFixedParameters and SetParameters calls.<br>
<br>
Like<br>
<br>
    bsTransformType::Pointer bsFinalTransform = bsTransformType::New();<br>
    // FIXED parameters MUST Be set first.<br>
    bsFinalTransform-&gt;SetFixedParameters( bsTransform-&gt;GetFixedParameters() );<br>
    bsFinalTransform-&gt;SetParameters(<br>
bsRegistration-&gt;GetLastTransformParameters() );<br>
<br>
<br>
With this change, the code runs for me until the end<br>
without throwing exceptions.<br>
<br>
<br>
The lbfgs optimizer is still unhappy though...<br>
<br>
<br>
<br>
   Regards,<br>
<br>
<br>
         Luis<br>
<br>
<br>
<br>
-------------------------------------------<br>
<div><div></div><div class="h5">On Wed, Oct 7, 2009 at 10:18 AM, Luis Ibanez &lt;<a href="mailto:luis.ibanez@kitware.com">luis.ibanez@kitware.com</a>&gt; wrote:<br>
&gt; Hi Darren,<br>
&gt;<br>
&gt; Yes, there are multiple ways of debugging this errror.<br>
&gt;<br>
&gt; It would seems that the grid of the BSpline transform<br>
&gt; is not defined, despite the fact that you seem to be<br>
&gt; setting that correctly (from looking at your code.)<br>
&gt;<br>
&gt; BTW: thanks for attaching the source code.<br>
&gt;<br>
&gt; The first thing to try, would be to add:<br>
&gt;<br>
&gt;    bsTransform-&gt;Print( std::cout );<br>
&gt;<br>
&gt; to line 594, just after the call to StartRegistration().<br>
&gt;<br>
&gt; This will allow us to see the state of the BSpline transform<br>
&gt; at that point. In particular we are interested in seeing<br>
&gt; the values of the BSpline grid.<br>
&gt;<br>
&gt;<br>
&gt;    Please let us know what you find,<br>
&gt;<br>
&gt;<br>
&gt;          Thanks<br>
&gt;<br>
&gt;<br>
&gt;                Luis<br>
&gt;<br>
&gt;<br>
&gt; -----------------------------------------------------------------------<br>
&gt; On Tue, Oct 6, 2009 at 6:28 PM, Darren Weber<br>
&gt; &lt;<a href="mailto:darren.weber.lists@gmail.com">darren.weber.lists@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Is there an easy way to debug this error?<br>
&gt;&gt;<br>
&gt;&gt; vnl_lbfgs: Error. Netlib routine lbfgs failed.<br>
&gt;&gt; terminate called after throwing an instance of &#39;itk::ExceptionObject&#39;<br>
&gt;&gt;   what():<br>
&gt;&gt; /opt/local/include/InsightToolkit-3.16/Common/itkBSplineDeformableTransform.txx:347:<br>
&gt;&gt; itk::ERROR: BSplineDeformableTransform(0x126f390): Mismatched between<br>
&gt;&gt; parameters size 128 and region size 0<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; See code file attached.  Example files are available at<br>
&gt;&gt; <a href="ftp://ftp.buckinstitute.org/dweber/itkRegistrationFiles.tar.gz" target="_blank">ftp://ftp.buckinstitute.org/dweber/itkRegistrationFiles.tar.gz</a><br>
&gt;&gt;<br>
&gt;&gt; The src code builds OK and it&#39;s called using:<br>
&gt;&gt;<br>
&gt;&gt;         # Bspline deformation registration: $imgMov TO $imgFix<br>
&gt;&gt;         $HOME/bin/itkImageBsplineCoregistration \<br>
&gt;&gt;             $imgFixBW  $imgMovBW  ${imgOutBW}.${imgType} \<br>
&gt;&gt;             $imgFixRGB $imgMovRGB ${imgOutRGB}.${imgType} \<br>
&gt;&gt;             ${imgOutBW}_DiffBefore.$imgType \<br>
&gt;&gt;             ${imgOutBW}_DiffAfter.$imgType &gt; ${imgOutBW}.log<br>
&gt;&gt;<br>
&gt;&gt; TIA,<br>
&gt;&gt; Darren<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _____________________________________<br>
&gt;&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt;<br>
&gt;&gt; Visit other Kitware open-source projects at<br>
&gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt;<br>
&gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt;<br>
&gt;&gt; Follow this link to subscribe/unsubscribe:<br>
&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;<br>
&gt;&gt;<br>
&gt;<br>
</div></div></blockquote></div><br>