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

时间:2020-07-02 08:21:00

标签: matlab image-processing slice surface image-rotation

我对使用obliqueslice function in Matlab有疑问。我有一个包含图像数据的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函数做了同样的事情,但是因为然后我必须首先制定表面的大小,所以这不是理想的。斜切会自动创建正确的表面尺寸。

0 个答案:

没有答案