我目前必须从一堆2D切片(MATLAB中的2D矩阵,代表2D灰度图像)创建一个球体。我使用下面的代码创建了一堆切片。为了创建球体,我已经重复创建了大小逐渐增加的圆形切片,直到100,然后减小尺寸。所有这些切片都被添加到3D矩阵中。
Circle = ones(200,400,400);
for i = 1:100
[rr cc] = meshgrid(1:400);
C = sqrt((rr-200).^2+(cc-200).^2)<=i;
for j = 1:400
for k = 1:400
Circle(i,j,k) = C(j,k);
end
end
end
index = 100;
for i = 1:100
[rr cc] = meshgrid(1:400);
C = sqrt((rr-200).^2+(cc-200).^2)<=index;
for j = 1:400
for k = 1:400
Circle(i+100,j,k) = C(j,k);
end
end
index = index - 1;
end
viewer3d(Circle);
viewer3d
是第3部分库,可帮助您将切片的3D图像堆栈视为3d对象。一旦我想象出这个“假定的”球体,我意识到它是一个钻石形状的顶部,而不是一个球体。
因此我不明白如何改变圆的大小直到y
平面中球体的中心点,然后用相同的算法减小它。
感谢您的回答,请不要犹豫,请我澄清这个问题中的任何内容。
答案 0 :(得分:3)
或者,直接创建一个球体,不使用循环:
Circle = zeros(200,400,400);
[x,y,z]=meshgrid(1:size(Circle,1),1:size(Circle,2),1:size(Circle,3));
radius=??; %// e.g. radius=100;
%//this sphere is centered in the middle of the image
Circle(sqrt((x-size(Circle,1)/2).^2+(y-size(Circle,2)/2).^2..
+(z-size(Circle,2)/2).^2)<radius)=1;
答案 1 :(得分:1)
是的,沿Z轴的半径不是线性的,而是随cos / sin函数而变化。使用this representation:
你的半径是“Radius = r sin(Theta)”,其中“Theta = arccos(r / z)”。因此,“r”是球体的半径,“z”是您想要绘制的水平/切片。不要忘记“z”从 - “r”变为“r”。我测试了公式,它适用于图像堆栈(切片)。