Matlab和斜切片:绕任意z轴旋转

Matlab和斜切片:绕任意z轴旋转,matlab,image-processing,slice,surface,image-rotation,Matlab,Image Processing,Slice,Surface,Image Rotation,我有一个关于使用的问题。我有一个包含图像数据的3D矩阵,希望通过这个体积创建径向切片。用户定义轴:具有x和y值(p_x和p_y)的坐标。然后,该函数将参照该给定点和法向量创建一个穿过体积的切片 我认为通过绕z轴旋转法向量,我可以得到正确的切片,但是通过这种方式,切片也绕着自己的轴旋转。检索的切片不会停留在一个方向上 p_x = pos(1); p_y = pos(2); p_z = 0; th = linspace(0,pi,n_a+1); th(end)=[]; x_0 = 10; y_0

我有一个关于使用的问题。我有一个包含图像数据的3D矩阵,希望通过这个体积创建径向切片。用户定义轴:具有x和y值(p_x和p_y)的坐标。然后,该函数将参照该给定点和法向量创建一个穿过体积的切片

我认为通过绕z轴旋转法向量,我可以得到正确的切片,但是通过这种方式,切片也绕着自己的轴旋转。检索的切片不会停留在一个方向上

p_x = pos(1);
p_y = pos(2);
p_z = 0;


th = linspace(0,pi,n_a+1);
th(end)=[];
x_0 = 10;
y_0 = 0;
xunit = x_0 * cos(th) - y_0 * sin(th);
yunit = x_0 * sin(th) + y_0 * cos(th);

data = struct;

figure
colormap(gray)
plot3(p_x,p_y,p_z,'or','MarkerFaceColor','r'); %plot point in volume
grid on
xlabel('x-axis')
ylabel('y-axis');
zlabel('z-axis');

hold on

for k = 1:1:length(th)
    
    plot3(xunit(k),yunit(k),0,'ob','MarkerFaceColor','b'); %plot normal
    [B,x,y,z] = obliqueslice(im, [p_x, p_y, p_z], [xunit(k) yunit(k) p_z], 'OutputSize','Full');
    data(k).th = th(k);
    data(k).B = B;
    data(k).x = x;
    data(k).y = y;
    data(k).z = z;
    
    surf(x,y,z,B,'EdgeColor','None');

    pause(1)
    drawnow
end
如上所述:p_x和p_y是旋转轴的坐标,p_z为零,因为我不想绕高度旋转。xunit和yunit是法向量,绕z轴旋转,所以这里的z坐标也是零。切片数由n_a给出。因为切片穿过整个体积,所以角度差中的步骤是使用linspace n_a+1完成的,然后删除最后一个值,因为这将得到与第一个相同的切片


这是使用倾斜切片绕轴旋转的正确方法吗?我使用surf和slice函数做了同样的事情,但是因为我必须首先确定曲面的大小,这并不理想。倾斜切片自动创建正确大小的曲面。

我这里没有得到这个部分:对于
th(1)=0
,那么
[p\u x,p\u y]
等于
[xunit(1)yunit(1)]
对吗?那么,我们如何确定只有一个点的轴呢?不,p_x和p_y都是由用户给定的,是一个平面必须穿过的坐标,并且在每个坐标系中。这个平面与xunit和yunit给出的法向量正交,法向量绕z轴旋转。我这里没有得到这部分:对于
th(1)=0
,那么
[p_x,p_y]
等于
[xunit(1)yunit(1)]
对吗?那么,我们如何确定只有一个点的轴呢?不,p_x和p_y都是由用户给定的,是一个平面必须穿过的坐标,并且在每个坐标系中。该平面与xunit和yunit给出的法向量正交,法向量绕z轴旋转。