从Matlab中的多个球体图中提取横截面

时间:2014-06-08 20:33:19

标签: matlab

我知道球体的位置(中心和半径)。我想提取横截面。我可以使用以下Matlab代码绘制放置在立方体中的球体:

[X,Y,Z] = sphere;
for SpNum = 1:NumSpheres
    surf( X*Radius(SpNum)+Center(SpNum,1), Y*Radius(SpNum)+Center(SpNum,2), Z*Radius(SpNum)+Center(SpNum,3), ...
    'FaceColor','r' );
%shading interp;
hold on;
end
axis tight; daspect([1 1 1]);

在上面的代码中,每个球体可以具有不同的半径并且它们不重叠(因此中心也不同)。

然而,上述代码不会生成横截面。我想提取类似于我们从X射线CT数据得到的横截面:Z方向上的一系列图像。我认为'interp2 / interp3'和'slice'函数是相关的函数,但我不知道如何使用它们来生成横截面。如果有人能指点或为我的问题提供一些示例代码,我将不胜感激?

- 提前致谢。

更新

我尝试使用meshgrid生成网格点,后跟函数F(X,Y,Z),如下所示:

[X,Y,Z] = meshgrid(1:100,1:100,1:100);
F = zeros(size(X),'uint8');
for SpNum = 1:NumSpheres
    F( sqrt((X - Center(SpNum,1)).^2 + (Y - Center(SpNum,2)).^2 + (Z -     Center(SpNum,3)).^2) <= Radius(SpNum) ) = 1;
end
surf(F);

接下来是:

z = 1;
I = interp3(X, Y, Z, X*Radius(SpNum)+Center(SpNum,1), Y*Radius(SpNum)+Center(SpNum,2), Z*Radius(SpNum)+Center(SpNum,3), z, 'spline');
figure, imshow(I);

我知道interp3是要使用的函数,因为它插入函数F(X,Y,Z)的值,它代表有界框内不同位置的球体(比如1:100,1:100,1 :100)。特定'z'(= 1,2,3 ... 100)处的插值应该给出100个横截面(以2-D图像的形式)。

缺陷在函数F本身,因为'surf'抛出一个错误,说F应该是一个数组 - “CData必须是M-by-N矩阵或M-by-N-by-3数组”

任何人都可以帮忙。

1 个答案:

答案 0 :(得分:0)

我终于明白了。为了他人的利益,这里是代码。

% A 3-D matrix 'F' which has its value at particular coordinate set to 255 if it belongs to any one of the spheres and 0 otherwise.
[X,Y,Z] = meshgrid(1:100,1:100,1:100);
F = zeros(size(X));
for SpNum = 1:NumSpheres
    F( sqrt((X - Center(SpNum,1)).^2 + (Y - Center(SpNum,2)).^2 + (Z - Center(SpNum,3)).^2) <= Radius(SpNum) ) = 255;        
end
% Extract cross sections from F using interp3 function along the z-axis.
I = zeros(size(X));
for z = 1:100
    I(:,:,z) = interp3(X, Y, Z, F, 1:100, (1:100)', z, 'spline');
end
implay(I,4);

您可以通过将中心(三维矢量)和每个球体的半径(某些任意NumSpheres)设置为某些随机值来测试和可视化输出。上面的代码将显示一个带有横截面的窗口。

以前,我试图使用“冲浪”冲浪。渲染不正确的球体。要渲染,您必须使用第一个代码段。我犯的另一个错误是使用第六个参数的行向量而不是列向量。

希望这有帮助。

- 干杯, 拉姆。