原文:http://blogs.mathworks.com/steve/2006/08/17/spatial-transformations-three-dimensional-rotation/
The Image Processing Toolbox function tformarray is a very general multidimensional spatial transformer and can be used for three-dimensional rotation. Here's how.
Make a three-dimensional blob
First, let's make a three-dimensional image containing a blob that will easily show the effect of a rotation.
[x,y,z] = ndgrid(-1:.025:1);
blob = z <= 0 & z >= -0.75 & x.^2 + y.^2 <= sqrt(0.25);
blob = blob | (z > 0 & (abs(x) + abs(y) <= (0.5 - z)));
Display the blob using isosurface and patch.
p = patch(isosurface(blob,0.5));
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
daspect([1 1 1]);
view(3)
camlight
lighting gouraud
Make a 3-D affine tform struct
We want to rotate the blob about its own center. For me, the simplest way to construct an affine transform matrix that will do that is to use three steps:
- Translate the middle of the blob to the origin.
- Rotate the blob.
- Translate the rotated blob back to its starting location.
Here's the first translation:
blob_center = (size(blob) + 1) / 2
T1 = [1 0 0 0
0 1 0 0
0 0 1 0
-blob_center 1]
Now here's the rotation. In this example we'll rotate about the second dimension.
theta = pi/8;
T2 = [cos(theta) 0 -sin(theta) 0
0 1 0 0
sin(theta) 0 cos(theta) 0
0 0 0 1]
And here's the final translation.
T3 = [1 0 0 0
0 1 0 0
0 0 1 0
blob_center 1]
The forward mapping is the composition of T1, T2, and T3.
T = T1 * T2 * T3
tform = maketform('affine', T);
Let's do a quick sanity check: the tform struct should map the blob center to itself.
tformfwd(blob_center, tform)
What the tformarray inputs mean
Now let's see how to make the inputs to the tformarray function. The syntax of tformarray is B = tformarray(A, T, R, TDIMS_A, TDIMS_B, TSIZE_B, TMAP_B, F).