[Insight-users] rigid2D registration fails to rotate images
Darren Weber
darren.weber.lists at gmail.com
Tue Mar 9 18:07:46 EST 2010
FYI, here's a snip from the "rotation loop" (see ImageRegistration6.cxx for
the rest):
// The registration fails when the angle of rotation is large, so we
need a
// loop to evaluate a range of angles to find one that will work well.
double angleInDegrees[] = { 0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0,
70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0,
180.0 };
double angleInRadians, bestAngleInRadians;
unsigned int bestIterations = 0;
TransformType::Pointer rigid2DFinalTransform = TransformType::New();
OptimizerType::MeasureType bestMetric = 0.0;
for( unsigned int i = 0; i < 19; i++ )
{
angleInRadians = angleInDegrees[i] * vnl_math::pi / 180.0;
std::cout
<< std::endl
<< "Loop " << i << ", trying:" << std::endl
<< "angleInDegrees = " << angleInDegrees[i] << " degrees " <<
std::endl
<< "angleInRadians = " << angleInRadians << std::endl
<< std::endl;
initializer->InitializeTransform();
rigid2DTransform->SetAngle( angleInRadians );
registration->SetInitialTransformParameters(
rigid2DTransform->GetParameters() );
try
{
registration->StartRegistration();
if( VERBOSE )
{
std::cout << std::endl
<< optim << std::endl
<< std::endl;
}
}
catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
// Check the metric and store the best angle
if( i == 0 )
bestMetric = optim->GetValue();
if( bestMetric > optim->GetValue() )
{
bestMetric = optim->GetValue();
bestIterations = optim->GetCurrentIteration();
bestAngleInRadians = angleInRadians;
// ** Set the final rigid2DTransform **
rigid2DFinalTransform->SetParameters(
registration->GetLastTransformParameters() );
rigid2DFinalTransform->SetFixedParameters(
rigid2DTransform->GetFixedParameters() );
}
std::cout
<< std::endl
<< "After loop " << i << ", metrics are:" << std::endl
<< "angleInDegrees = " << angleInDegrees[i] << " degrees " <<
std::endl
<< "angleInRadians = " << angleInRadians << std::endl
<< "bestMetric = " << bestMetric << std::endl
<< "currentMetric = " << optim->GetValue() << std::endl
<< std::endl;
}
Best,
Darren
On Mon, Mar 8, 2010 at 11:14 AM, Darren Weber
<darren.weber.lists at gmail.com>wrote:
>
> Hi Luis et al.,
>
> Thanks for considering this and offering suggestions.
>
> There are thousands of images to register. It'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 "rotation loop"
> that:
>
> (a) sets a rotation value between 0 to pi (stepping 15 degrees),
>
> (b) calls the registration method, then
>
> (c) checks the metric for the lowest value (for mean sq metric) to
> identify and store the rotation that provides the "best" registration.
>
> The extra "rotation" 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
> "best" rotation value.
>
> Is this reasonable? Is there are better way to do this?
>
> As a novice with optimization, I'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.
>
> Take care,
> Darren
>
>
>
>
> On Sat, Mar 6, 2010 at 3:58 PM, Luis Ibanez <luis.ibanez at kitware.com>wrote:
>
>> Darren,
>>
>>
>> Thanks for posting all the source code and images that
>> reproduce the problem that you are observing.
>>
>>
>> As Richard pointed out, the registration process must be
>> initialized properly.
>>
>>
>> It is very unlikely that an optimization process will manage
>> to register two images that are 140 degrees off, as the ones
>> that you kindly posted.
>>
>>
>> So you should:
>>
>> 1) Initialize the Transform with an angle close to 140 degrees.
>>
>> 2) Use the Rigid2DTransform instead of the
>> CenteredRigid2DTransform (this later one is deprecated)
>>
>> 3) Remove all the Change image filters that you have in your
>> code. They shouldn't be necessary.
>>
>>
>> Please find attached a simplified variation of the example:
>>
>> Insight/Examples/Registration/
>> ImageRegistration6.cxx
>>
>> With this attached .cxx file,
>> I manage to register your two images with the following output:
>>
>> Angle (radians) 2.45657
>> Angle (degrees) 140.751
>> Translation X = 1.67046
>> Translation Y = -0.480926
>> Iterations = 92
>> Metric value = 6.19969e+07
>>
>>
>> I ran it with the following set of command line arguments:
>>
>> ImageRegistration6
>>
>> section0004_w1.tif section0005_w1.tif 150.0 output.tiff
>>
>>
>> Where "150.0" is the initial angle to set in the Transform.
>>
>>
>> Please give it a try at this attached code and let us
>> know if you find any problems.
>>
>>
>> Thanks
>>
>>
>> Luis
>>
>>
>>
>> --------------------------------------------------------------------------------------
>> On Fri, Mar 5, 2010 at 7:56 PM, Richard Beare <richard.beare at gmail.com>
>> wrote:
>> > Good initialization is essential for all registration, with the
>> > rotation component often the most critical. If the rotation is greater
>> > than 15 degrees then you're probably going to have trouble.
>> >
>> > If you're trying to build an automated process rather than a one off,
>> > then here are some options.
>> >
>> > Moments based initialization as a first step. This is good if the
>> > scene is reasonably simple, or you have masks defining the regions of
>> > interest. You can check how similar the major moments are. If they are
>> > sufficiently dissimilar then the initialization is likely to be
>> > accurate along the major axis, but potentially flipped. In this case
>> > you need to try both options and select the one that gives the best
>> > resulting cost. If the moments are similar then the initialization
>> > will be unreliable and sensitive to small changes, so you need to try
>> > a series of angles covering the entire 360 degrees and select the best
>> > result as defined by your cost metric.
>> >
>> > On Sat, Mar 6, 2010 at 11:45 AM, Darren Weber
>> > <darren.weber.lists at gmail.com> wrote:
>> >>
>> >> I've got a couple of images that clearly need nearly 180 degree
>> rotation for
>> >> registration, see:
>> >> ftp://anonymous@ftp.buckinstitute.org/dweber/section0004_w1.tif
>> >> ftp://anonymous@ftp.buckinstitute.org/dweber/section0005_w1.tif
>> >> The registration fails to rotate the images into alignment. I'm using:
>> >> // Registration components
>> >> #include "itkImageRegistrationMethod.h"
>> >> #include "itkMeanSquaresImageToImageMetric.h"
>> >> #include "itkLinearInterpolateImageFunction.h"
>> >> #include "itkRegularStepGradientDescentOptimizer.h"
>> >> // Transforms
>> >> #include "itkCenteredRigid2DTransform.h"
>> >> #include "itkCenteredTransformInitializer.h"
>> >>
>> >> What can I do about it? Have I selected the wrong transform for
>> rotations?
>> >> I've prepared a package of my test program and data for download here:
>> >> ftp://anonymous@
>> ftp.buckinstitute.org/dweber/itkRegistrationTest.tar.gz
>> >> The program is built against ITK 3.16 (and it uses Boost).
>> >> TIA,
>> >> Darren
>> >>
>> >> _____________________________________
>> >> Powered by www.kitware.com
>> >>
>> >> Visit other Kitware open-source projects at
>> >> http://www.kitware.com/opensource/opensource.html
>> >>
>> >> Kitware offers ITK Training Courses, for more information visit:
>> >> http://www.kitware.com/products/protraining.html
>> >>
>> >> Please keep messages on-topic and check the ITK FAQ at:
>> >> http://www.itk.org/Wiki/ITK_FAQ
>> >>
>> >> Follow this link to subscribe/unsubscribe:
>> >> http://www.itk.org/mailman/listinfo/insight-users
>> >>
>> >>
>> > _____________________________________
>> > Powered by www.kitware.com
>> >
>> > Visit other Kitware open-source projects at
>> > http://www.kitware.com/opensource/opensource.html
>> >
>> > Kitware offers ITK Training Courses, for more information visit:
>> > http://www.kitware.com/products/protraining.html
>> >
>> > Please keep messages on-topic and check the ITK FAQ at:
>> > http://www.itk.org/Wiki/ITK_FAQ
>> >
>> > Follow this link to subscribe/unsubscribe:
>> > http://www.itk.org/mailman/listinfo/insight-users
>> >
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20100309/9ca7bd35/attachment-0001.htm>
More information about the Insight-users
mailing list