Main Content

Use Phase Correlation as Preprocessing Step in Registration

This example shows how to use phase correlation as a preliminary step for automatic image registration. In this process, you perform phase correlation, using imregcorr, and then pass the result of that registration as the initial condition of an optimization-based registration, using imregister. Phase correlation and optimization-based registration are complementary algorithms. Phase correlation is good for finding gross alignment, even for severely misaligned images. Optimization-based registration is good for finding precise alignment, given a good initial condition.

Read an image that will be the reference image in the registration.

fixed = imread('cameraman.tif');

Figure contains an axes. The axes contains an object of type image.

Create an unregistered image by deliberately distorting this image using rotation, isotropic scaling, and shearing in the y direction.

theta = 170;
rot = [cosd(theta) sind(theta) 0;... 
    sind(theta) cosd(theta) 0;... 
    0 0 1]; 
sc = 2.3;
scale = [sc 0 0; 0 sc 0; 0 0 1]; 
sh = 0.5;
shear = [1 sh 0; 0 1 0; 0 0 1]; 

tform = affine2d(shear*scale*rot);
moving = imwarp(fixed,tform); 

Add noise to the image, and display the result.

moving = moving + uint8(10*rand(size(moving)));

Figure contains an axes. The axes contains an object of type image.

Estimate the registration required to bring these two images into alignment. imregcorr returns an affine2d object that defines the transformation.

tformEstimate = imregcorr(moving,fixed);

Apply the estimated geometric transform to the misaligned image. Specify 'OutputView' to make sure the registered image is the same size as the reference image. Display the original image and the registered image side-by-side. You can see that imregcorr has done a good job handling the rotation and scaling differences between the images. The registered image, movingReg, is very close to being aligned with the original image, fixed. But some misalignment remains. imregcorr can handle rotation and scale distortions well, but not shear distortion.

Rfixed = imref2d(size(fixed));
movingReg = imwarp(moving,tformEstimate,'OutputView',Rfixed);

Figure contains an axes. The axes contains an object of type image.

View the aligned image overlaid on the original image, using imshowpair. In this view, imshowpair uses color to highlight areas of misalignment.


Figure contains an axes. The axes contains an object of type image.

To finish the registration, use imregister, passing the estimated transformation returned by imregcorr as the initial condition. imregister is more effective if the two images are roughly in alignment at the start of the operation. The transformation estimated by imregcorr provides this information for imregister. The example uses the default optimizer and metric values for a registration of two images taken with the same sensor ( 'monomodal' ).

[optimizer, metric] = imregconfig('monomodal');
movingRegistered = imregister(moving, fixed,...
    'affine', optimizer, metric,'InitialTransformation',tformEstimate);

Display the result of this registration. Note that imregister has achieved a very accurate registration, given the good initial condition provided by imregcorr.

imshowpair(fixed, movingRegistered,'Scaling','joint');

Figure contains an axes. The axes contains an object of type image.

See Also

| | |