在Matlab中生成几何形状的3D二进制掩模

时间:2016-04-05 07:40:17

标签: matlab image-processing

我想生成一个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; 

提前致谢!

3 个答案:

答案 0 :(得分:3)

要生成可以使用方程式的二进制形状掩码,您可以按照以下步骤操作:

  • 生成网格(ndgrid)。确保域限制包括体积/表面蒙版,并根据需要选择网格分辨率。
  • 使用体积/曲面方程生成二元模板,方法是将坐标与方程进行简单的逻辑比较。

简单的2D示例:

让我们定义一个简单的椭圆(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 Ellipsoid:

嗯,这是完全相同的方法,除了我们要为网格添加一个维度,并使用椭圆体的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;

对于您上面的值看起来像, enter image description here

xr = 15; yr = 45; zr = 15;

enter image description here

可以使用

定义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