<br>Of the potential problems mentioned, the most obvious is getting the data oriented roughly, so I&#39;m trying to do that first.  I&#39;m using ResampleImageFilter4.cxx, modified for 3D rotation.  Input and output is mhd, unsigned shorts.  <br>
<br>When I rotate the volume by any amount, there is no visible difference.  I tried 0, 1, 10, 45, 89, and 90 deg.  What am I doing wrong?<br><br>When a volume is rotated, the dimensions of the volume in the output mhd file should account for it, right?  So rotating 45 deg should increase one of the dimensions.<br>

<div style="margin-left: 40px;"><br><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;itkImage.h&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;itkImageFileReader.h&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;itkImageFileWriter.h&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;itkResampleImageFilter.h&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;itkLinearInterpolateImageFunction.h&quot;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;itkAffineTransform.h&quot;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">int main( int argc, char * argv[] )</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;">  if( argc &lt; 4 )</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;">    std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; std::endl;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    std::cerr &lt;&lt; argv[0] &lt;&lt; &quot;  inputImageFile  outputImageFile  degrees&quot; &lt;&lt; std::endl;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    return EXIT_FAILURE;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    }</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const     unsigned int   Dimension = 3;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef   unsigned short  InputPixelType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef   unsigned short  OutputPixelType;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef itk::Image&lt; InputPixelType,  Dimension &gt;   InputImageType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef itk::Image&lt; OutputPixelType, Dimension &gt;   OutputImageType;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef itk::ImageFileReader&lt; InputImageType  &gt;  ReaderType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef itk::ImageFileWriter&lt; OutputImageType &gt;  WriterType;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  ReaderType::Pointer reader = ReaderType::New();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  WriterType::Pointer writer = WriterType::New();</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  reader-&gt;SetFileName( argv[1] );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  writer-&gt;SetFileName( argv[2] );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const double angleInDegrees = atof( argv[3] );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef itk::ResampleImageFilter&lt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                  InputImageType, OutputImageType &gt;  FilterType;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  FilterType::Pointer filter = FilterType::New();</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef itk::AffineTransform&lt; double, Dimension &gt;  TransformType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  TransformType::Pointer transform = TransformType::New();</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  typedef itk::LinearInterpolateImageFunction&lt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                       InputImageType, double &gt;  InterpolatorType;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  InterpolatorType::Pointer interpolator = InterpolatorType::New();</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  filter-&gt;SetInterpolator( interpolator );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  filter-&gt;SetDefaultPixelValue( 100 );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  reader-&gt;Update();</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const InputImageType * inputImage = reader-&gt;GetOutput();</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const InputImageType::SpacingType &amp; spacing = inputImage-&gt;GetSpacing();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const InputImageType::PointType &amp; origin  = inputImage-&gt;GetOrigin();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  InputImageType::SizeType size =</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">      inputImage-&gt;GetLargestPossibleRegion().GetSize();</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  filter-&gt;SetOutputOrigin( origin );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  filter-&gt;SetOutputSpacing( spacing );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  filter-&gt;SetOutputDirection( inputImage-&gt;GetDirection() );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  filter-&gt;SetSize( size );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  filter-&gt;SetInput( reader-&gt;GetOutput() );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  writer-&gt;SetInput( filter-&gt;GetOutput() );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  TransformType::OutputVectorType translation1;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const double imageCenterX = origin[0] + spacing[0] * size[0] / 2.0;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const double imageCenterY = origin[1] + spacing[1] * size[1] / 2.0;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const double imageCenterZ = origin[2] + spacing[2] * size[2] / 2.0;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  translation1[0] =   -imageCenterX;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  translation1[1] =   -imageCenterY;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  translation1[2] =   -imageCenterZ;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  transform-&gt;Translate( translation1 );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  std::cout &lt;&lt; &quot;imageCenterX = &quot; &lt;&lt; imageCenterX &lt;&lt; std::endl;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  std::cout &lt;&lt; &quot;imageCenterY = &quot; &lt;&lt; imageCenterY &lt;&lt; std::endl;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  std::cout &lt;&lt; &quot;imageCenterZ = &quot; &lt;&lt; imageCenterZ &lt;&lt; std::endl;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const double degreesToRadians = vcl_atan(1.0) / 45.0;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  const double angle = angleInDegrees * degreesToRadians;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  transform-&gt;Rotate3D( -angle, false );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  TransformType::OutputVectorType translation2;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  translation2[0] =   imageCenterX;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  translation2[1] =   imageCenterY;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  translation2[2] =   imageCenterZ;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  transform-&gt;Translate( translation2, false );</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  filter-&gt;SetTransform( transform );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  try</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;">    writer-&gt;Update();</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;">  catch( itk::ExceptionObject &amp; excep )</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;">    std::cerr &lt;&lt; &quot;Exception caught !&quot; &lt;&lt; std::endl;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    std::cerr &lt;&lt; excep &lt;&lt; std::endl;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    }</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">  return EXIT_SUCCESS;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">}</span><br style="font-family: courier new,monospace;">
</div>
<br>
<br>
<br><br><br><br><div class="gmail_quote">On Tue, Nov 30, 2010 at 9:29 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;">
Hi Kevin<br>
<div class="im"><br>
On Tue, Nov 30, 2010 at 1:23 PM, Kevin Neff &lt;<a href="mailto:kevin.l.neff@gmail.com">kevin.l.neff@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Thanks, Dan.  I used the example ImageRegistration8.cxx with my data.<br>
&gt;<br>
&gt; First, it&#39;s terribly slow.  Is there anything I can do to speed it up?<br>
<br>
<br>
</div>1)  How long it took ?<br>
<br>
2)  How many cores do you have ?<br>
<br>
3) What version of ITK are you using ?<br>
<br>
4) Make sure that you compile it for Release mode.<br>
     (that easily makes a difference of 10x with respect to Debug mode).<br>
<div class="im"><br>
<br>
&gt; my limited experience, applying a threshold first and skipping rotation of<br>
&gt; voxels below the threshold helped.  Or could I pre-compute isotropic voxels<br>
&gt; and skip the interpolation that follows image rotation and just interpolate<br>
&gt; the final solution?  Any suggestion is welcome!<br>
&gt;<br>
<br>
</div>You could also use a Mask,<br>
See example:<br>
<br>
ITK/Examples/Registration/ImageRegistration12.cxx<br>
<div class="im"><br>
<br>
&gt; Second, after 200 iterations,  the output does not appear correct.  I ran it<br>
&gt; with data that had the dimensions 13888x560x48 and 1388x560x53 but the<br>
&gt; output had the dimensions 13888x560x48.  The volumes were of the shell of a<br>
&gt; large object, rotated 90 deg, so I&#39;m sure the dimension of the output should<br>
&gt; have been much larger---something like 1388x1000x100.<br>
<br>
</div>a) 90 degrees is beyond the capture radio of any registration method.<br>
    You must initialize the Transform to account for most of that rotation.<br>
    In practice you shouldn&#39;t expect the optimization process to correct<br>
    for more than 20 to 30 degrees of rotation.<br>
<br>
b) Is that rotation along the long axis of your image ? or perpendicular to it ?<br>
    A screen shot of your image will be very helpful...<br>
<br>
c) You should carefully control the parameter scales to make sure that<br>
    you account for the proportion of radians units (used for rotation) to<br>
    millimeters used for translation.<br>
<br>
d) What is the pixel spacing of your images ?<br>
<div><div></div><div class="h5"><br>
<br>
&gt;<br>
&gt; KLN<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Sun, Nov 21, 2010 at 7:55 AM, Dan Mueller &lt;<a href="mailto:dan.muel@gmail.com">dan.muel@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hi Kevin,<br>
&gt;&gt;<br>
&gt;&gt; I highly recommending the entire ITK Software Guide:<br>
&gt;&gt;    <a href="http://www.itk.org/ItkSoftwareGuide.pdf" target="_blank">http://www.itk.org/ItkSoftwareGuide.pdf</a><br>
&gt;&gt;<br>
&gt;&gt; For your specific question, see section 8.8.<br>
&gt;&gt;<br>
&gt;&gt; In short:<br>
&gt;&gt;<br>
&gt;&gt; IdentityTransform: identity<br>
&gt;&gt; TranslationTransform: n-D translation<br>
&gt;&gt; ScaleTransform: n-D scaling<br>
&gt;&gt; CenteredRigid2DTransform: 2-D rotation + translation<br>
&gt;&gt; Similarity2DTransform: 2-D scaling + rotation + translation<br>
&gt;&gt; VersorTransform: 3-D rotation<br>
&gt;&gt; VersorRigid3DTransform: 3-D rotation + translation<br>
&gt;&gt; Similarity3DTransform: 3-D scaling + rotation + translation<br>
&gt;&gt; AffineTransform: n-D scaling + rotation + translation + shear<br>
&gt;&gt;<br>
&gt;&gt; HTH<br>
&gt;&gt;<br>
&gt;&gt; Cheers, Dan<br>
&gt;&gt;<br>
&gt;&gt; On 21 November 2010 13:49, Kevin Neff &lt;<a href="mailto:kevin.l.neff@gmail.com">kevin.l.neff@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I need to register images using rotation and translation.  Is that<br>
&gt;&gt; &gt; possible<br>
&gt;&gt; &gt; with theITK classes, or do I have to write my own?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I&#39;m basing this question on a translation-only example and the list of<br>
&gt;&gt; &gt; classes derived from AffineTransform<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; <a href="http://www.itk.org/Wiki/ITK_Image_Registration" target="_blank">http://www.itk.org/Wiki/ITK_Image_Registration</a><br>
&gt;<br>
&gt;<br>
</div></div>&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.html" target="_blank">http://www.kitware.com/products/protraining.html</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>
&gt;<br>
</blockquote></div><br>