Новая попытка решения:
После обучения http://blogs.mathworks.com/steve/2006/08/17/spatial-transformations-three-dimensional-rotation/ и внесения небольших изменений я могу кое-что вам помочь. Имейте в виду, у меня мало или нет опыта работы с объемными данными в MATLAB, поэтому реализация довольно хакерская.
В приведенном ниже коде я использую tformarray (), чтобы вращать структуру в пространстве. Сначала данные центрируются, а затем поворачиваются с использованием вращениемmat3D для создания пространственного преобразования, прежде чем данные возвращаются в исходное положение.
Поскольку я никогда раньше не использовал tformarray, я управлял точками данных, выходящими за пределы определенной области после поворота, просто заполняя матрицу данных (NxMxP) нулями вокруг. Если кто-нибудь знает лучший способ, пожалуйста, сообщите нам:)
код:
%Synthetic dataset, 25x50x25
blob = flow();
%Pad to allow for rotations in space. Bad solution,
%something better might be possible to better understanding
%of tformarray()
blob = padarray(blob,size(blob));
f1 = figure(1);clf;
s1=subplot(1,2,1);
p = patch(isosurface(blob,1));
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
daspect([1 1 1]);
view([1 1 1])
camlight
lighting gouraud
%Calculate center
blob_center = (size(blob) + 1) / 2;
%Translate to origin transformation
T1 = [1 0 0 0
0 1 0 0
0 0 1 0
-blob_center 1];
%Rotation around [0 0 1]
rot = -pi/3;
Rot = rotationmat3D(rot,[0 1 1]);
T2 = [ 1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1];
T2(1:3,1:3) = Rot;
%Translation back
T3 = [1 0 0 0
0 1 0 0
0 0 1 0
blob_center 1];
%Total transform
T = T1 * T2 * T3;
%See http://blogs.mathworks.com/steve/2006/08/17/spatial-transformations-three-dimensional-rotation/
tform = maketform('affine', T);
R = makeresampler('linear', 'fill');
TDIMS_A = [1 2 3];
TDIMS_B = [1 2 3];
TSIZE_B = size(blob);
TMAP_B = [];
F = 0;
blob2 = ...
tformarray(blob, tform, R, TDIMS_A, TDIMS_B, TSIZE_B, TMAP_B, F);
s2=subplot(1,2,2);
p2 = patch(isosurface(blob2,1));
set(p2, 'FaceColor', 'red', 'EdgeColor', 'none');
daspect([1 1 1]);
view([1 1 1])
camlight
lighting gouraud
Произвольная визуализация, приведенная ниже, просто для подтверждения того, что данные повернуты, как и ожидалось, на графике замкнутой поверхности, когда данные приняли значение «1». С blob2 вы должны знать, что сможете проецировать, используя простые суммы.
figure(2)
subplot(1,2,1);imagesc(sum(blob,3));
subplot(1,2,2);imagesc(sum(blob2,3));