Main Content

Register Images with Projection Distortion Using Control Points

This example shows how to register two images by selecting control points common to both images and inferring a geometric transformation that aligns the control points.

Read Images

Read the image westconcordorthophoto.png into the workspace. This image is an orthophoto that has already been registered to the ground.

ortho = imread("westconcordorthophoto.png");
imshow(ortho)
text(size(ortho,2),size(ortho,1)+15, ...
    "Image courtesy of Massachusetts Executive Office of Environmental Affairs", ...
    FontSize=7,HorizontalAlignment="right");

Read the image westconcordaerial.png into the workspace. This image was taken from an airplane and is distorted relative to the orthophoto. Because the unregistered image was taken from a distance and the topography is relatively flat, it is likely that most of the distortion is projective.

unregistered = imread("westconcordaerial.png");
imshow(unregistered)
text(size(unregistered,2),size(unregistered,1)+15, ...
    "Image courtesy of mPower3/Emerge", ...
    FontSize=7,HorizontalAlignment="right");

Select Control Point Pairs

To select control points interactively, open the Control Point Selection tool by using the cpselect function. Control points are landmarks that you can find in both images, such as a road intersection or a natural feature. Select at least four pairs of control points so that cpselect can fit a projective transformation to the control points. After you have selected corresponding moving and fixed points, close the tool to return to the workspace.

[mp,fp] = cpselect(unregistered,ortho,Wait=true);

Nine pairs of control points selected in the Control Point Selection tool.

Infer Geometric Transformation

Find the parameters of the projective transformation that best aligns the moving and fixed points by using the fitgeotform2d function.

t = fitgeotform2d(mp,fp,"projective")
t = 
  projtform2d with properties:

    Dimensionality: 2
                 A: [3×3 double]

Transform Unregistered Image

To apply the transformation to the unregistered aerial image, use the imwarp function. Specify that the size and position of the transformed image match the size and position of the ortho image by using the OutputView name-value argument.

Rfixed = imref2d(size(ortho));
registered = imwarp(unregistered,t,OutputView=Rfixed);

See the result of the registration by overlaying the transformed image over the original orthophoto.

imshowpair(ortho,registered,"blend")

See Also

| | | | |

Related Topics