<div><br></div><div>Hi Luis et al.,</div><div><br></div><div>Thanks for considering this and offering suggestions.</div><div><br></div><div>There are thousands of images to register.  It&#39;s possible to manually note approximate initialization values for the rotation of all the images.  However, it may be easier (perhaps not quicker) to create a &quot;rotation loop&quot; that:</div>
<div><br></div><div> (a) sets a rotation value between 0 to pi (stepping 15 degrees),</div><div><br></div><div> (b) calls the registration method, then</div><div><br></div><div> (c) checks the metric for the lowest value (for mean sq metric) to identify and store the rotation that provides the &quot;best&quot; registration.</div>
<div><br></div><div>The extra &quot;rotation&quot; loop means running the registration N times (say 13 times for 0:15:180 [in Octave syntax]) and there may be a final run with the &quot;best&quot; rotation value.</div><div>
<br></div><div>Is this reasonable?  Is there are better way to do this?</div><div><br></div>As a novice with optimization, I&#39;m surprised that some kind of quick estimate for the full range of rotations is not built into the optimization routine or the registration method.<div>
<br></div><div>Take care,</div><div>Darren</div><div><br></div><div><br></div><div><br><br><div class="gmail_quote">On Sat, Mar 6, 2010 at 3: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="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Darren,<br>
<br>
<br>
Thanks for posting all the source code and images that<br>
reproduce the problem that you are observing.<br>
<br>
<br>
As Richard pointed out, the registration process must be<br>
initialized properly.<br>
<br>
<br>
It is very unlikely that an optimization process will manage<br>
to register two images that are 140 degrees off, as the ones<br>
that you kindly posted.<br>
<br>
<br>
So you should:<br>
<br>
1)  Initialize the Transform with an angle close to 140 degrees.<br>
<br>
2)  Use the Rigid2DTransform instead of the<br>
     CenteredRigid2DTransform (this later one is deprecated)<br>
<br>
3)  Remove all the Change image filters that you have in your<br>
     code. They shouldn&#39;t be necessary.<br>
<br>
<br>
Please find attached a simplified variation of the example:<br>
<br>
    Insight/Examples/Registration/<br>
                            ImageRegistration6.cxx<br>
<br>
With this attached .cxx file,<br>
I manage to register your two images with the following output:<br>
<br>
 Angle (radians) 2.45657<br>
 Angle (degrees) 140.751<br>
 Translation X = 1.67046<br>
 Translation Y = -0.480926<br>
 Iterations    = 92<br>
 Metric value  = 6.19969e+07<br>
<br>
<br>
I ran it with the following set of command line arguments:<br>
<br>
ImageRegistration6<br>
<br>
     section0004_w1.tif section0005_w1.tif 150.0 output.tiff<br>
<br>
<br>
Where &quot;150.0&quot; is the initial angle to set in the Transform.<br>
<br>
<br>
Please give it a try at this attached code and let us<br>
know if you find any problems.<br>
<br>
<br>
     Thanks<br>
<br>
<br>
            Luis<br>
<br>
<br>
--------------------------------------------------------------------------------------<br>
<div><div></div><div class="h5">On Fri, Mar 5, 2010 at 7:56 PM, Richard Beare &lt;<a href="mailto:richard.beare@gmail.com">richard.beare@gmail.com</a>&gt; wrote:<br>
&gt; Good initialization is essential for all registration, with the<br>
&gt; rotation component often the most critical. If the rotation is greater<br>
&gt; than 15 degrees then you&#39;re probably going to have trouble.<br>
&gt;<br>
&gt; If you&#39;re trying to build an automated process rather than a one off,<br>
&gt; then here are some options.<br>
&gt;<br>
&gt; Moments based initialization as a first step. This is good if the<br>
&gt; scene is reasonably simple, or you have masks defining the regions of<br>
&gt; interest. You can check how similar the major moments are. If they are<br>
&gt; sufficiently dissimilar then the initialization is likely to be<br>
&gt; accurate along the major axis, but potentially flipped. In this case<br>
&gt; you need to try both options and select the one that gives the best<br>
&gt; resulting cost. If the moments are similar then the initialization<br>
&gt; will be unreliable and sensitive to small changes, so you need to try<br>
&gt; a series of angles covering the entire 360 degrees and select the best<br>
&gt; result as defined by your cost metric.<br>
&gt;<br>
&gt; On Sat, Mar 6, 2010 at 11:45 AM, 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; I&#39;ve got a couple of images that clearly need nearly 180 degree rotation for<br>
&gt;&gt; registration, see:<br>
&gt;&gt; <a href="ftp://anonymous" target="_blank">ftp://anonymous</a>@<a href="http://ftp.buckinstitute.org/dweber/section0004_w1.tif" target="_blank">ftp.buckinstitute.org/dweber/section0004_w1.tif</a><br>
&gt;&gt; <a href="ftp://anonymous" target="_blank">ftp://anonymous</a>@<a href="http://ftp.buckinstitute.org/dweber/section0005_w1.tif" target="_blank">ftp.buckinstitute.org/dweber/section0005_w1.tif</a><br>
&gt;&gt; The registration fails to rotate the images into alignment.  I&#39;m using:<br>
&gt;&gt; // Registration components<br>
&gt;&gt; #include &quot;itkImageRegistrationMethod.h&quot;<br>
&gt;&gt; #include &quot;itkMeanSquaresImageToImageMetric.h&quot;<br>
&gt;&gt; #include &quot;itkLinearInterpolateImageFunction.h&quot;<br>
&gt;&gt; #include &quot;itkRegularStepGradientDescentOptimizer.h&quot;<br>
&gt;&gt; // Transforms<br>
&gt;&gt; #include &quot;itkCenteredRigid2DTransform.h&quot;<br>
&gt;&gt; #include &quot;itkCenteredTransformInitializer.h&quot;<br>
&gt;&gt;<br>
&gt;&gt; What can I do about it?  Have I selected the wrong transform for rotations?<br>
&gt;&gt; I&#39;ve prepared a package of my test program and data for download here:<br>
&gt;&gt; <a href="ftp://anonymous" target="_blank">ftp://anonymous</a>@<a href="http://ftp.buckinstitute.org/dweber/itkRegistrationTest.tar.gz" target="_blank">ftp.buckinstitute.org/dweber/itkRegistrationTest.tar.gz</a><br>

&gt;&gt; The program is built against ITK 3.16 (and it uses Boost).<br>
&gt;&gt; TIA,<br>
&gt;&gt; Darren<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; Kitware offers ITK Training Courses, for more information visit:<br>
&gt;&gt; <a href="http://www.kitware.com/products/protraining.html" target="_blank">http://www.kitware.com/products/protraining.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>
&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>
</div></div></blockquote></div><br></div>