2016-01-13 175 views
2

我目前必须从一堆2D切片(MATLAB中的二维矩阵,它们表示二维灰度图像)创建一个球体。我使用下面的代码创建了一堆切片。为了创建球体,我已经重复创建了大小增加到100的圆的切片,然后减小了大小。所有这些切片都添加到3D矩阵中。我需要从一堆2D切片创建一个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是第三部分库,它可以帮助您查看片的3D图像栈的3D对象。一旦我想象出这个“假定”的球体,我意识到它是一个菱形的顶部而不是球体。

因此,我不知道如何改变圆的大小,直到y平面中的球体的中心点,然后用相同的算法减小它。

谢谢你的回答,请不要犹豫,让我澄清这个问题中的任何事情。

+0

我从除去不相干[\ [切片\]](http://stackoverflow.com/tags/slice/info)标签的题。请在发布之前阅读标签描述,以确保标签意味着您认为它的含义:)此外,您可以使用'for i = 100:-1:1'创建递归循环,更一般地看一下什么'100:-1:1'是。 –

+0

@AndrasDeak我忘记了'for i = 100:-1:1'!谢谢你提醒我!我在谈论标签描述的粗略意义上的切片,而是一个科学切片。然而标签去除是合理的! –

+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

是的,沿着Z轴的半径不是线性的,而是随着cos/sin函数而变化的。使用this representation

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

你的半径为 “半径= R罪(西塔)”,与 “西塔= ARCCOS(R/Z)”。所以“r”是你的球体的半径,“z”是你想要画的水平/切片。不要忘记,“z”从 - “r”到“r”。我已经测试过这些公式,并且它对于图像堆栈(切片)可以正常工作。

+4

这不是一个好的答案。完全不清楚OP如何应用您的笔记。不要忘记,如果OP拥有坚定的数学背景(必须使你的笔记变得清晰),他首先不会有这个问题。在目前的形式中,你的回答应该是一个评论。 –

+1

@AndrasDeak哈哈,我觉得我的数学技能不符合您的期望! –

+0

@SharanDuggirala我并不是故意要冒犯你:)相反,我为了你而将这段评论留给了FiReTiTi,我可能没有发现它对你有用。 –