# 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 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")`