<br>Right.  After fixing this foolish error, it seems to be working.  <br><br>Still, the final dimensions are identical to the original dimensions.  If I rotate the image 90 deg around the x axis, the width will not change but the height and depth should change.  Is there a way to expand the &quot;canvas&quot; (putting it in GIMP/Photoshop terms)?<br>

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