Infer spatial transformation from control point pairs

`cp2tform`

is not recommended. Use `fitgeotrans`

instead.

`tform = cp2tform(movingPoints,fixedPoints,transformationType)`

`tform = cp2tform(movingPoints,fixedPoints,'polynomial',degree)`

`tform = cp2tform(movingPoints,fixedPoints,'lwm',n)`

```
tform = cp2tform(movingPoints,fixedPoints,'piecewise
linear')
```

```
[tform,usedMP,usedFP,badMP,badFP] = cp2tform(movingPoints,fixedPoints,'piecewise
linear')
```

`tform = cp2tform(cpstruct,transformationType,___)`

```
[tform,usedMP,usedFP]
= cp2tform(cpstruct,transformationType,___)
```

infers a spatial transformation from control point pairs and returns this transformation as a
`tform`

= cp2tform(`movingPoints`

,`fixedPoints`

,`transformationType`

)`tform`

structure. Some of the transformation types have optional additional
parameters, shown in the following syntaxes.

lets you specify the order of the polynomials to use.`tform`

= cp2tform(`movingPoints`

,`fixedPoints`

,'polynomial',`degree`

)

creates a mapping by inferring a polynomial at each control point using neighboring control
points. The mapping at any location depends on a weighted average of these polynomials. You can
optionally specify the number of points, `tform`

= cp2tform(`movingPoints`

,`fixedPoints`

,'lwm',`n`

)`n`

, used to infer each polynomial.
The `n`

closest points are used to infer a polynomial of order 2 for each
control point pair.

creates a Delaunay triangulation of the fixed control points, and maps corresponding moving
control points to the fixed control points. The mapping is linear (affine) for each triangle
and continuous across the control points but not continuously differentiable as each triangle
has its own mapping.`tform`

= cp2tform(`movingPoints`

,`fixedPoints`

,'piecewise
linear')

`[`

returns in `tform`

,`usedMP`

,`usedFP`

,`badMP`

,`badFP`

] = cp2tform(`movingPoints`

,`fixedPoints`

,'piecewise
linear')`usedMP`

and `usedFP`

the control points that
were used for the piecewise linear transformation. This syntax also returns in
`badMP`

and `badFP`

the control points that were
eliminated because they were middle vertices of degenerate fold-over triangles.

uses a `tform`

= cp2tform(`cpstruct`

,`transformationType`

,___)`cpstruct`

structure to store the control point coordinates of the
moving and fixed images.

`[`

also returns in `tform`

,`usedMP`

,`usedFP`

]
= cp2tform(`cpstruct`

,`transformationType`

,___)`usedMP`

and `usedFP`

the control points
that were used for the transformation. Unmatched and predicted points are not used. See
`cpstruct2pairs`

.

Transform an image, use the `cp2tform`

function to return the
transformation, and compare the angle and scale of the `tform`

to the angle and
scale of the original transformation:

```
I = checkerboard;
J = imrotate(I,30);
fixedPoints = [11 11; 41 71];
movingPoints = [14 44; 70 81];
cpselect(J,I,movingPoints,fixedPoints);
t = cp2tform(movingPoints,fixedPoints,'nonreflective similarity');
```

Recover angle and scale by checking how a unit vector parallel to the
*x*-axis is rotated and stretched.

u = [0 1]; v = [0 0]; [x, y] = tformfwd(t,u,v); dx = x(2) - x(1); dy = y(2) - y(1); angle = (180/pi) * atan2(dy, dx) scale = 1 / sqrt(dx^2 + dy^2)

When

`transformtype`

is`'nonreflective similarity'`

,`'similarity'`

,`'affine'`

,`'projective'`

, or`'polynomial'`

, and`movingPoints`

and`fixedPoints`

(or`cpstruct`

) have the minimum number of control points needed for a particular transformation,`cp2tform`

finds the coefficients exactly.If

`movingPoints`

and`fixedPoints`

have more than the minimum number of control points, a least-squares solution is found. See`mldivide`

.When either

`movingPoints`

or`fixedPoints`

has a large offset with respect to their origin (relative to range of values that it spans),`cp2tform`

shifts the points to center their bounding box on the origin before fitting a`tform`

structure. This enhances numerical stability and is handled transparently by wrapping the origin-centered`tform`

within a custom`tform`

that automatically applies and undoes the coordinate shift as needed. As a result,`fields(T)`

can give different results for different coordinate inputs, even for the same transformation type.

[1] Goshtasby, Ardeshir, "Piecewise linear mapping functions for image
registration," *Pattern Recognition*, Vol. 19, 1986, pp.
459-466.

[2] Goshtasby, Ardeshir, "Image registration by local approximation
methods," *Image and Vision Computing*, Vol. 6, 1988, pp.
255-261.

`cpcorr`

| `cpselect`

| `cpstruct2pairs`

| `imtransform`

| `tformfwd`

| `tforminv`