【问题标题】:I need to create a 3D sphere from a bunch of 2D slices我需要从一堆 2D 切片创建一个 3D 球体
【发布时间】:2016-04-18 03:29:50
【问题描述】:

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

感谢您的回答,请随时要求我澄清此问题中的任何内容。

【问题讨论】:

  • 我从您的问题中删除了不相关的[slice] 标签。请在发布前阅读标签说明,以确保标签表示您认为的含义:) 此外,您可以使用 for i=100:-1:1 创建一个递减 for 循环,更一般地查看 100:-1:1 是什么。跨度>
  • @AndrasDeak 我忘记了for i=100:-1:1!谢谢你提醒我!我说的是标签描述的粗略意义上的切片,而是科学切片。然而,标签删除是合理的!
  • 对不起,如果我误解了,欢迎您重新标记您的问题:)这也是我发表评论的原因:您可以判断它的正确性。
  • 我还想指出,您的提问技巧和 MATLAB 技巧都有很大提高:) 很高兴看到您不断进步,并继续努力!
  • @AndrasDeak,你记得我!顺便说一句,谢谢你,我一直在大学做研究员,并且一直在使用很多 MATLAB 进行图像处理。在 SO 上的所有功劳归功于 MATLAB 社区,这一直在帮助我!

标签: matlab image-processing 3d


【解决方案1】:

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

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

【讨论】:

  • 这不是一个好的答案。完全不清楚 OP 应该如何应用您的注释。不要忘记,如果 OP 有坚实的数学背景(有必要破译你的笔记),他一开始就不会遇到这个问题。以目前的形式,您的答案应该是评论。
  • @AndrasDeak 哈哈,我觉得我的数学水平没有达到你的预期!
  • @SharanDuggirala 我不是故意要冒犯你的:)相反,为了你的缘故,我为 FiReTiTi 留下了这条评论,我可能觉得它对你没有用处。
  • @AndrasDeak:如果我的回答可以理解或不够详细,他可以简单地向我询问更多细节。我已经对其进行了编辑和测试。
  • @FiReTiTi 如果您确实了解 matlab,我鼓励您在 [matlab] 标签出现时给出基于代码的答案,并且问题包含 matlab 代码:) 我'确信这对海报和 Stack Overflow 都有好处。 (就是这样,我现在就不再打扰你了。)
【解决方案2】:

或者,直接创建一个球体,不使用循环:

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;

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 2020-01-21
    • 2023-03-22
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多