我需要从一堆2D切片中创建一个3D球体

时间:2016-01-13 08:41:29

标签: matlab image-processing 3d

我目前必须从一堆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平面中球体的中心点,然后用相同的算法减小它。

感谢您的回答,请不要犹豫,请我澄清这个问题中的任何内容。

2 个答案:

答案 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

http://www.derivations.org/sphere.png

你的半径是“Radius = r sin(Theta)”,其中“Theta = arccos(r / z)”。因此,“r”是球体的半径,“z”是您想要绘制的水平/切片。不要忘记“z”从 - “r”变为“r”。我测试了公式,它适用于图像堆栈(切片)。