我想生成一个3D二进制掩码,它代表一个椭圆体,其中心为xc,yc,zc和radiuces xr,yr,zr。
我注意到函数椭球在给定这些参数的情况下会生成一个点网格。但是,我希望数据用二进制矩阵表示(在我的例子中,大小为[100,100,100]),而不是网格。
我的参数是:
mask = zeros(100,100,100);
xc = 50; yc = 50; zc = 50;
xr = 15; yr = 15; zr = 15;
提前致谢!
答案 0 :(得分:3)
要生成可以使用方程式的二进制形状掩码,您可以按照以下步骤操作:
ndgrid
)。确保域限制包括体积/表面蒙版,并根据需要选择网格分辨率。让我们定义一个简单的椭圆(2D)。
%% // Simple 2D example
xc = 5 ; yc = 6 ; %// ellipse center = (5,6)
xr = 3 ; yr = 2 ; %// ellipse radiuses
xbase = linspace(0,10,11) ; %// temporary variable used to send to "ndgrid"
[xm,ym] = ndgrid( xbase , xbase ) ; %// generate base mesh
mask = ( ((xm-xc).^2/(xr.^2)) + ((ym-yc).^2/(yr.^2)) <= 1 ) %// get binary mask
给你二进制掩码:
mask =
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0
0 0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 1 1 1 0 0 0
0 0 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
当然,您几乎无法识别蒙版中的椭圆,但我将分辨率保持在较低水平以便能够将其显示为文本。您可以通过定义更精细的网格来轻松提高分辨率。
嗯,这是完全相同的方法,除了我们要为网格添加一个维度,并使用椭圆体的3D方程。所以对于你的确切案例:
%% // 3D ellipsoid
xc = 50; yc = 50; zc = 50;
xr = 15; yr = 15; zr = 15;
xbase = linspace(1,100,100) ;
[xm,ym,zm] = ndgrid( xbase , xbase , xbase) ;
mask = ( ((xm-xc).^2/(xr.^2)) + ((ym-yc).^2/(yr.^2)) + ((zm-zc).^2/(zr.^2)) <= 1 ) ;
我无法使用这些3D数组向您显示文本输出,但您的mask
现在是一个3D逻辑数组,在椭圆体内部包含true
,在其他地方包含false
。
答案 1 :(得分:2)
你可以用Heaviside函数做到这一点,这可能需要更多考虑才能得到你想要的东西,但作为一个开始,
close all
clear all
%Setup Domain
maxdomain = 100;
mindomain = 0.;
step = 1.0;
X = mindomain:step:maxdomain;
Y = mindomain:step:maxdomain;
Z = mindomain:step:maxdomain;
[x,y,z] = meshgrid(X,Y,Z);
xc = 50; yc = 50; zc = 50;
xr = 15; yr = 15; zr = 15;
r2 = xr/2;
r = sqrt((x-xc).^2/xr + (y-yc).^2/yr + (z-zc).^2/zr);
u = heaviside(r-r2);
%Plot Surface of sphere
p = patch(isosurface(x,y,z,u));
isonormals(x,y,z,u,p)
set(p,'FaceColor','red','EdgeColor','none');
camlight ; alpha(0.6);
xlabel('x'); ylabel('y'); zlabel('z');
daspect([1,1,1]); view(3);
axis tight; camlight; camlight(-80,-10);
lighting gouraud;
和xr = 15; yr = 45; zr = 15;
,
可以使用
定义Heaviside函数function [out]=heaviside(x)
out=0.5.*(sign(x)+1.0);
end
如果符号数学工具箱不可用。
答案 2 :(得分:2)
如果我理解你的问题,这应该有效:
mask = zeros(100, 100, 100);
%//your ellipsoid properties
xc = 50; yc = 50; zc = 50;
xr = 15; yr = 15; zr = 15;
for x=1:100
for y=1:100
for z=1:100
if ( ((x-xc)/xr)*((x-xc)/xr) + ((y-yc)/yr)*((y-yc)/yr) + ((z-zc)/zr)*((z-zc)/zr) < 1 )
mask(x,y,z) = 1; %//set elements within ellipsoid to 1
end
end
end
end