[Insight-users] Questions about Registering 2 image with small overlap

Luis Ibanez luis.ibanez at kitware.com
Sat Mar 21 12:28:55 EDT 2009


Hi Michael,

Are these two images that *actually* correspond to two contiguous
fields of view from a microscope ?

That is, are you actually trying to build a mosaic (or to stitch)
these two images ?

If so, then,  is the width of the overlap of 20 pixels consistent
with what you will expect as overlap, knowing how the images were
acquired in the microscopy ?

If so, then, the good news is that you just need to set the
FixedImageRegion to be at the location (and size) of the overlapping
region.

The error that you are getting:

  MeanSquaresImageToImageMetric(0x569100): Too many samples map outside
 > moving image buffer: 13840 / 1722508


Indicates that the overlap between the images is too small.
(which may be perfectly fine for the initial locations of your two
images, if what you are doing is building a mosaic)( but may be
an indication of a problem, if what you are doing is registering
two identical fields of view, acquired at different times (e.g. time
lapse)).

If you are in the "building a mosaic" case, then just replace:

  registration->SetFixedImageRegion(
 >         fixedImageReader->GetOutput()->GetBufferedRegion());
 >

with

    registration->SetFixedImageRegion(
        regionOverlapThanMichaelWillCompute );

that region will have the width of 20 pixels that you just indicated.



The mean square metric is fine for what you are doing, *IF* this
are two images from the same modality (e.g. there were both acquired
using the same spectrum).

On the other hand, if you were registering two images that you acquired
using two differen monochromatic filters, then you may want to use
MattesMutualInformation.

You will  do us a great favor by simply posting the two images in a
public web site.   :-)

and elaborating more on what you are actually doing. (e.g. a diagram
will be great).



      Regards,


         Luis



-----------------------
Michael Jackson wrote:
> I'm _still_ new to the whole ITK/Image Registration thing. I have been  
> over the ITK manual a few times (selected sections that I thought was  
> relevant) but I am having a tough time getting a registration to work  
> out. Here is what I have.
> 
> 2 Images. Both are 1292 pixels wide by 968 pixels high. The scaling of  
> the image is 0.207987 microns/pixel. The origins (upper left, not the  
> it probably matters) are:
> 
> Image 0: 47113.2, 48448.5 (microns)
> Image 1: 47369.2, 48448.8 (microns).
> 
>  So basically the edges overlap by a little bit (about 20 pixels or  
> so). The edges are not quite lined up properly with those settings  
> (which came from the instrument the image was captured on) so I am  
> trying to run the images through ITK in order to align them better.
> 
>  I am getting the exception: Description: itk::ERROR:  
> MeanSquaresImageToImageMetric(0x569100): Too many samples map outside  
> moving image buffer: 13840 / 1722508
> 
> which I _think_ is telling me that something is "off" in where the  
> images are being placed in physical space.
> 
> I am not even sure if I am using the proper Image Metric for this type  
> of problem. The images are grayscale in nature.
> 
> Here is some code for your perusal. Any pointers on what I might be  
> doing wrong would surely be appreciated.
> 
> Thanks
> Mike Jackson
> 
> 
> const unsigned int Dimension = 2;
> typedef unsigned char PixelType;
> typedef itk::Image<PixelType, Dimension>             FixedImageType;
> typedef itk::Image<PixelType, Dimension>               MovingImageType;
> typedef itk::TranslationTransform<double, Dimension>    TransformType;
> typedef itk::RegularStepGradientDescentOptimizer            OptimizerType;
> typedef itk::MeanSquaresImageToImageMetric
>                <FixedImageType, MovingImageType> MetricType;
> typedef itk::LinearInterpolateImageFunction
>                    <MovingImageType, double> InterpolatorType;
> typedef itk::ImageRegistrationMethod
>                    <FixedImageType, MovingImageType> RegistrationType;
> typedef itk::ImageFileReader< FixedImageType >  ReaderType;
> typedef itk::ImageFileWriter< FixedImageType >  WriterType;
> typedef itk::Point< double, FixedImageType::ImageDimension > PointType;
> 
> 
> FixedImageType::PointType fixedOrigin;
> fixedOrigin[0] = 47113.2;
> fixedOrigin[1] = 48448.5;
> 
> MovingImageType::PointType movingOrigin;
> movingOrigin[0] = 47369.2;
> movingOrigin[1] = 48447.8;
> 
> fixedImageReader->GetOutput()->SetOrigin(fixedOrigin);
> movingImageReader->GetOutput()->SetOrigin(movingOrigin);
> 
>   //--- Set the Spacing of the images
> FixedImageType::SpacingType fixedSpacing;
> fixedSpacing[0] = 0.207987;
> fixedSpacing[1] = 0.207987;
> MovingImageType::SpacingType movingSpacing;
> movingSpacing[0] = 0.207987;
> movingSpacing[1] = 0.207987;
> 
> fixedImageReader->GetOutput()->SetSpacing(fixedSpacing);
> movingImageReader->GetOutput()->SetSpacing(movingSpacing);
> 
> registration->SetFixedImage(fixedImageReader->GetOutput());
> registration->SetMovingImage(movingImageReader->GetOutput());
> 
> registration->SetFixedImageRegion(
>         fixedImageReader->GetOutput()->GetBufferedRegion());
> 
> typedef RegistrationType::ParametersType ParametersType;
> ParametersType initialParameters(transform->GetNumberOfParameters());
> initialParameters[0] = INITIAL_TRANS_X; // Initial offset in mm along X
> initialParameters[1] = INITIAL_TRANS_Y; // Initial offset in mm along  Y 
> registration->SetInitialTransformParameters(initialParameters);
> 
> 
> _____________________________________
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.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
> 


More information about the Insight-users mailing list