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);
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
cpselect
| cpcorr
| cpstruct2pairs
| fitgeotform2d
| imref2d
| imwarp