<div>Hi,</div>
<div>&nbsp;</div>
<div>I encountered a problem when trying to deform a 3D image. The way I deformed the image is as the following: I created a 3D contour for an organ, say, lung for this image. Along the contours I have a bunch of points. Then I generated a&nbsp;vector field&nbsp;for these points and used these vectors to deform the image. I didn't have trouble deforming any 2D image. But for 3D image I got an error. I traced down to the point where the problem occured: in the try-catch block with deformer-&gt;UpdateLargestPossibleRegion();&nbsp;&nbsp;debugging&nbsp;reports&nbsp;a problem on line 417 of vnl_matrix.txx&nbsp;file.&nbsp;For&nbsp;reference purpose I copy and paste that part of code here:
</div>
<div>
<p>//: Sets all elements of matrix to specified value. O(m*n).</p>
<p>template&lt;class T&gt;<br>void vnl_matrix&lt;T&gt;::fill (T const&amp; value)<br>{<br>&nbsp; for (unsigned int i = 0; i &lt; this-&gt;num_rows; i++)<br>&nbsp;&nbsp;&nbsp; for (unsigned int j = 0; j &lt; this-&gt;num_cols; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;data[i][j] = value;&nbsp;&nbsp; &lt;========================================= debugging reports problem !
<br>}</p>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>Also, I am attaching&nbsp;my code of&nbsp;deforming 3D images&nbsp;below. I would greatly appreciate it if anybody can help look into it.</div>
<div>&nbsp;</div>
<div>Best regards,</div>
<div>Ming</div>
<div>&nbsp;</div>
<div>
<p>// ---------------- starting of the code&nbsp; -------------------------<br>#include &quot;itkVector.h&quot;<br>#include &quot;itkImage.h&quot;<br>#include &quot;itkImageRegionIteratorWithIndex.h&quot;<br>#include &quot;itkDeformationFieldSource.h
&quot;<br>#include &quot;itkImageFileReader.h&quot;<br>#include &quot;itkImageFileWriter.h&quot;<br>#include &quot;itkWarpImageFilter.h&quot;<br>#include &quot;itkLinearInterpolateImageFunction.h&quot;</p>
<p>#include &quot;itkNormalVariateGenerator.h&quot;<br>#include &quot;vtkPolyDataReader.h&quot;<br>#include &quot;vtkPolyDataWriter.h&quot;<br>#include &quot;vtkFloatArray.h&quot;<br>#include &quot;vtkPolyData.h&quot;<br>
#include &quot;vtkPointData.h&quot;<br>#include &quot;vtkPoints.h&quot;</p>
<p>#include &lt;fstream&gt;</p>
<p>int main( int argc, char * argv[] )<br>{</p>
<p>&nbsp;if( argc &lt;&nbsp;2 )<br>&nbsp;{<br>&nbsp;&nbsp;std::cerr &lt;&lt; &quot;Missing Parameters &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; argv[0];<br>&nbsp;&nbsp;std::cerr &lt;&lt; &quot; landmarksFile fixedImage &quot;;
<br>&nbsp;&nbsp;std::cerr &lt;&lt; &quot;movingImage deformedMovingImage&quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;return 1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;const&nbsp;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; Dimension = 3;<br>&nbsp;typedef&nbsp;&nbsp; float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VectorComponentType;</p>
<p>&nbsp;typedef&nbsp;&nbsp; itk::Vector&lt; VectorComponentType, Dimension &gt;&nbsp;&nbsp;&nbsp; VectorType;<br>&nbsp;typedef&nbsp;&nbsp; itk::Image&lt; VectorType,&nbsp; Dimension &gt;&nbsp;&nbsp; DeformationFieldType;<br>&nbsp;typedef&nbsp;&nbsp; float&nbsp; PixelType;<br>&nbsp;typedef&nbsp;&nbsp; itk::Image&lt; PixelType, Dimension &gt;&nbsp; ImageType&nbsp; ;
<br>&nbsp;typedef&nbsp;&nbsp; itk::ImageFileReader&lt; ImageType&nbsp; &gt;&nbsp; ReaderType ;<br>&nbsp;typedef&nbsp;&nbsp; itk::ImageFileWriter&lt; ImageType&nbsp; &gt;&nbsp; WriterType ;</p>
<p>&nbsp;ReaderType::Pointer Reader = ReaderType::New();<br>&nbsp;Reader-&gt;SetFileName( argv[1] );</p>
<p>&nbsp;try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;Reader-&gt;Update();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;catch( itk::ExceptionObject &amp; excp )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;std::cerr &lt;&lt; &quot;Exception thrown &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;std::cerr &lt;&lt; excp &lt;&lt; std::endl;
<br>&nbsp;&nbsp;return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;WriterType::Pointer Writer = WriterType::New();<br>&nbsp;Writer-&gt;SetFileName( argv[2] );</p>
<p>&nbsp;ImageType::ConstPointer fixedImage = Reader-&gt;GetOutput();</p>
<p><br>&nbsp;typedef itk::DeformationFieldSource&lt; DeformationFieldType &gt;&nbsp; DeformationSourceType;<br>&nbsp;DeformationSourceType::Pointer deformer = DeformationSourceType::New();<br>&nbsp;deformer-&gt;SetOutputSpacing( fixedImage-&gt;GetSpacing() );
<br>&nbsp;deformer-&gt;SetOutputOrigin(&nbsp; fixedImage-&gt;GetOrigin() );<br>&nbsp;deformer-&gt;SetOutputRegion(&nbsp; fixedImage-&gt;GetLargestPossibleRegion() );</p>
<p>&nbsp;typedef DeformationSourceType::LandmarkContainer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LandmarkContainerType;<br>&nbsp;typedef DeformationSourceType::LandmarkPointType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LandmarkPointType;<br>&nbsp;LandmarkContainerType::Pointer sourceLandmarks = LandmarkContainerType::New();
<br>&nbsp;LandmarkContainerType::Pointer targetLandmarks = LandmarkContainerType::New();</p>
<p>&nbsp;vtkPolyDataReader *reader = vtkPolyDataReader::New();<br>&nbsp;reader-&gt;SetFileName( argv[2] );<br>&nbsp;reader-&gt;Update();<br>&nbsp;vtkPolyData *poly = vtkPolyData::New();<br>&nbsp;poly-&gt;DeepCopy( reader-&gt;GetOutput());<br>&nbsp;reader-&gt;Delete();
<br>&nbsp;vtkPoints *points = poly-&gt;GetPoints();<br>&nbsp;int NumberOfTotalPoints = points-&gt;GetNumberOfPoints();<br></p>
<p>&nbsp;unsigned int pointId = 0;<br>&nbsp;for ( int i = 0; i&lt; NumberOfTotalPoints; i++)<br>&nbsp;{<br>&nbsp;&nbsp;double pos[3]; points-&gt;GetPoint(i,pos);</p>
<p>&nbsp;&nbsp;double x = 0;<br>&nbsp;&nbsp;double y = 0;<br>&nbsp;&nbsp;double z = 0;</p>
<p>&nbsp;&nbsp;if ( i &lt; (int)NumberOfTotalPoints/2 ) {<br>&nbsp;&nbsp;&nbsp;x = 0.002*i;<br>&nbsp;&nbsp;&nbsp;y = 0.003*i;<br>&nbsp;&nbsp;&nbsp;z = 0.0001*i;<br>&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;x = 0.002*(NumberOfTotalPoints-1-i);<br>&nbsp;&nbsp;&nbsp;y = 0.003*(NumberOfTotalPoints-1-i);<br>&nbsp;&nbsp;&nbsp;z = 0.0001*
(NumberOfTotalPoints-1-i);<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;std::cout &lt;&lt; &quot;generator 1 and 2 :: &quot; &lt;&lt; i &lt;&lt; &quot;: \t&quot; &lt;&lt; x &lt;&lt; &quot;\t&quot; &lt;&lt; y &lt;&lt; &quot;\t&quot; &lt;&lt; z &lt;&lt; std::endl;</p>
<p>&nbsp;&nbsp;//&nbsp; Create source and target landmarks.<br>&nbsp;&nbsp;//&nbsp; <br>&nbsp;&nbsp;LandmarkPointType sourcePoint;<br>&nbsp;&nbsp;LandmarkPointType targetPoint;</p>
<p>&nbsp;&nbsp;sourcePoint[0] = pos[0] ;<br>&nbsp;&nbsp;sourcePoint[1] = pos[1] ;<br>&nbsp;&nbsp;sourcePoint[2] = pos[2] ;</p>
<p>&nbsp;&nbsp;targetPoint[0] = sourcePoint[0] + x ;<br>&nbsp;&nbsp;targetPoint[1] = sourcePoint[1] + y ;<br>&nbsp;&nbsp;&nbsp;targetPoint[2] = sourcePoint[2] + z ;</p>
<p>&nbsp;&nbsp;sourceLandmarks-&gt;InsertElement( pointId, sourcePoint );<br>&nbsp;&nbsp;targetLandmarks-&gt;InsertElement( pointId, targetPoint );<br>&nbsp;&nbsp;pointId++;</p>
<p>&nbsp;}</p>
<p>&nbsp;deformer-&gt;SetSourceLandmarks( sourceLandmarks.GetPointer() );<br>&nbsp;deformer-&gt;SetTargetLandmarks( targetLandmarks.GetPointer() );<br>&nbsp;<br>&nbsp;std::cout &lt;&lt; &quot; Up to this point we are still okay....&quot; &lt;&lt; std::endl;
</p>
<p>&nbsp;try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;deformer-&gt;UpdateLargestPossibleRegion();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;catch( itk::ExceptionObject &amp; excp )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;std::cerr &lt;&lt; &quot;Exception thrown &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;std::cerr &lt;&lt; excp &lt;&lt; std::endl;
<br>&nbsp;&nbsp;return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;std::cout &lt;&lt; &quot;the deformer is done at this point .... &quot; &lt;&lt; std::endl;</p>
<p>&nbsp;DeformationFieldType::ConstPointer deformationField = deformer-&gt;GetOutput();<br>&nbsp;typedef itk::WarpImageFilter&lt; ImageType, ImageType, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeformationFieldType&nbsp; &gt;&nbsp; FilterType;</p>
<p>&nbsp;FilterType::Pointer warper = FilterType::New();<br>&nbsp;typedef itk::LinearInterpolateImageFunction&lt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageType, double &gt;&nbsp; InterpolatorType;</p>
<p>&nbsp;InterpolatorType::Pointer interpolator = InterpolatorType::New();<br>&nbsp;warper-&gt;SetInterpolator( interpolator );<br>&nbsp;warper-&gt;SetOutputSpacing( deformationField-&gt;GetSpacing() );<br>&nbsp;warper-&gt;SetOutputOrigin(&nbsp; deformationField-&gt;GetOrigin() );
<br>&nbsp;warper-&gt;SetDeformationField( deformationField );<br>&nbsp;warper-&gt;SetInput( Reader-&gt;GetOutput() );<br>&nbsp;Writer-&gt;SetInput( warper-&gt;GetOutput() );</p>
<p><br>&nbsp; <br>&nbsp;try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;Writer-&gt;Update();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;catch( itk::ExceptionObject &amp; excp )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;std::cerr &lt;&lt; &quot;Exception thrown &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;std::cerr &lt;&lt; excp &lt;&lt; std::endl;
<br>&nbsp;&nbsp;return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }</p>
<p><br>&nbsp;return EXIT_SUCCESS;</p>
<p>}</p>
<p>// ---------------- end --------------------</p></div>