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 fixed
image.
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 fixed
and moving
images and create a geometric transformation fit to the control points, using fitgeotrans
.
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.
figure, imshowpair(fixed,registered,'blend');
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 imwarp's
'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');
Clean up.
iptsetpref('ImshowAxesVisible','off')