Main Content

N-Dimensional Spatial Transformations

You can perform N-D geometric transformations using the tformarray function. You can also use tformarray to perform mixed-dimensional transformations, in which the input and output arrays do not have the same dimensions. The output can have either a lower or higher number of dimensions than the input. For example, if you are sampling 3-D data on a 2-D slice or manifold, the input array might have a lower dimensionality. The output dimensionality might be higher, for example, if you combine multiple 2-D transformations into a single 2-D to 3-D operation.

Before using the tformarray function, prepare the input arguments required to perform the geometric transformation.

  • Create the spatial transformation using the maketform function. If you create the spatial transformation from a matrix, maketform expects the matrix to be in the postmultiply convention.

  • Create the resampling structure using the makeresampler function. A resampler structure defines how to interpolate values of the input array at specified locations. For example, you could specify your own separable interpolation kernel, build a custom resampler around the interp2 or interp3 functions, or even implement an advanced antialiasing technique. The resampling structure also controls the edge behavior when interpolating.

Next, apply the geometric transformation to an image using the tformarray function, specifying the spatial transformation structure and the resampling structure. You can also transform individual points and lines to explore the geometric effects of a transformation. Use the tformfwd and tforminv functions to perform forward and inverse transformations, respectively.

This example uses tformarray to perform a projective transformation of a checkerboard image, and makeresampler to create a resampling structure with a standard bicubic interpolation method.

I = checkerboard(20,1,1);
T = maketform("projective",[1 1; 41 1; 41 41; 1 41],...
              [5 5; 40 5; 35 30; -10 30]);
R = makeresampler("cubic","circular");
J = tformarray(I,T,R,[1 2],[2 1],[100 100],[],[]);

The makeresampler and tformarray functions enable you to control many aspects of the transformation. For example, note how tformarray created an output image that is larger than the size of the original image. Further, notice that the transformed image appears to contain multiple copies of the original image. This is accomplished by specifying a padding method in the resampling structure that extends the input image by repeating the pixels in a circular pattern.

Related Topics