Register Two Images Using Spatial Referencing to Enhance Display
This example shows how to use spatial referencing objects to understand the spatial relationship between two images in image registration and display them effectively. This example brings one of the images, called the
moving image, into alignment with the other image, called the
Read the two images of the same scene that are slightly misaligned.
fixed = imread('westconcordorthophoto.png'); moving = imread('westconcordaerial.png');
Display the moving (unregistered) image.
iptsetpref('ImshowAxesVisible','on') imshow(moving) text(size(moving,2),size(moving,1)+30, ... 'Image courtesy of mPower3/Emerge', ... 'FontSize',7,'HorizontalAlignment','right');
Load a MAT-file that contains preselected control points for the
moving images and create a geometric transformation fit to the control points, using
load westconcordpoints tform = fitgeotrans(movingPoints, fixedPoints, 'projective');
Perform the transformation necessary to register the
moving image with the
fixed image, using
imwarp . This example uses the optional
'FillValues' parameter to specify a fill value (white), which will help when displaying the
fixed image over the transformed
moving image, to check registration. Notice that the full content of the geometrically transformed
moving image is present, now called
registered . Also note that there are no blank rows or columns.
registered = imwarp(moving, tform,'FillValues', 255); figure, imshow(registered);
Overlay the transformed image,
registered , over the
fixed image, using
imshowpair . Notice how the two images appear misregistered. This happens because
imshowpair assumes that the images are both in the default intrinsic coordinate system. The next steps provide two ways to remedy this display problem.
Constrain the transformed image,
registered , to the same number of rows and columns, and the same spatial limits as the
fixed image. This ensures that the registered image appears registered with the fixed image but areas of the registered image that would extrapolate beyond the extent of the fixed image are discarded. To do this, create a default spatial referencing object that specifies the size and location of the
fixed image, and use
'OutputView' parameter to create a constrained resampled image
registered1. Display the registered image over the fixed image. In this view, the images appear to have been registered, but not all of the unregistered image is visible.
Rfixed = imref2d(size(fixed)); registered1 = imwarp(moving,tform,'FillValues', 255,'OutputView',Rfixed); figure, imshowpair(fixed,registered1,'blend');
As an alternative, use the optional
imwarp syntax that returns the output spatial referencing object that indicates the position of the full transformed image in the same default intrinsic coordinate system as the
fixed image. Display the registered image over the fixed image and note that now the full
registered image is visible.
[registered2, Rregistered] = imwarp(moving, tform,'FillValues', 255); figure, imshowpair(fixed,Rfixed,registered2,Rregistered,'blend');