作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想生成一个 3D 二进制掩码,它表示一个以 xc、yc、zc 为中心,以 xr、yr、zr 为半径的椭圆体。
我注意到函数 ellipsoid 在给定这些参数的情况下生成点网格。但是,我希望数据由二进制矩阵表示(在我的例子中,大小为 [100,100,100]),而不是网格。
我的参数是:
mask = zeros(100,100,100);
xc = 50; yc = 50; zc = 50;
xr = 15; yr = 15; zr = 15;
提前致谢!
最佳答案
要生成可以使用方程式的二进制形状掩码,您可以按照以下步骤操作:
ndgrid
)。确保域限制包括体积/表面掩模,并根据您的需要选择网格分辨率。让我们定义一个简单的椭圆(二维)。
%% // 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
虽然您几乎无法识别 mask 中的椭圆,但我将分辨率保持在较低水平以便能够将其显示为文本。您可以通过定义更精细的网格轻松提高分辨率。
好吧,除了我们要向网格添加一维,并使用椭球体的 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
别处。
关于matlab - 在 Matlab 中生成几何形状的 3D 二元掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36420023/
我是一名优秀的程序员,十分优秀!