Matlab中曲面网格的三维二值矩阵/图像
如何在Matlab中从曲面网格创建3D二进制矩阵/图像 例如,当我使用以下方法创建椭球体时:Matlab中曲面网格的三维二值矩阵/图像,matlab,Matlab,如何在Matlab中从曲面网格创建3D二进制矩阵/图像 例如,当我使用以下方法创建椭球体时: [x, y, z] = ellipsoid(0,0,0,5.9,3.25,3.25,30); 十、 Y和X都是尺寸为31 X 31的二维矩阵 根据@Magla的建议编辑: function Create_Mask_Basedon_Ellapsoid3() close all SurroundingVol = [50, 50, 20]; %DATA
[x, y, z] = ellipsoid(0,0,0,5.9,3.25,3.25,30);
十、 Y和X都是尺寸为31 X 31的二维矩阵
根据@Magla的建议编辑:
function Create_Mask_Basedon_Ellapsoid3()
close all
SurroundingVol = [50, 50, 20];
%DATA
[MatX,MatY,MatZ] = meshgrid(-24:1:25, -24:1:25, -9:1:10);
[mask1, x, y, z] = DrawEllipsoid([0, -10, 0], [6, 3, 3], MatX,MatY,MatZ);
[mask2, x2, y2, z2] = DrawEllipsoid([15, 14, 6], [6, 3, 3], MatX,MatY,MatZ);
mask = mask1 + mask2;
%Surface PLOT
figure('Color', 'w');
subplot(1,2,1);
%help: Ideally I would like to generate surf plot directly from combined mask= mask1 + mask2;
s = surf(x,y,z); hold on;
s2 = surf(x2,y2,z2); hold off;
title('SURFACE', 'FontSize', 16);
view(-78,22)
subplot(1,2,2);
xslice = median(MatX(:));
yslice = median(MatY(:));
zslice = median(MatZ(:));
%help: Also how do I decide correct "slice" and angles to 3D visualization.
h = slice(MatX, MatY, MatZ, double(mask), xslice, yslice, zslice)
title('BINARY MASK - SLICE VOLUME', 'FontSize', 16);
set(h, 'EdgeColor','none');
view(-78, 22)
%az = 0; el = 90;
%view(az, el);
end
function [mask, Ellipsoid_x, Ellipsoid_y, Ellipsoid_z] = DrawEllipsoid(CenterEllipsoid, SizeEllipsoid, MatX, MatY, MatZ)
[Ellipsoid_x, Ellipsoid_y, Ellipsoid_z] = ellipsoid(CenterEllipsoid(1), CenterEllipsoid(2), CenterEllipsoid(3), SizeEllipsoid(1)/2 , SizeEllipsoid(2)/2 , SizeEllipsoid(3)/2 ,30);
v = [Ellipsoid_x(:), Ellipsoid_y(:), Ellipsoid_z(:)]; %3D points
%v = [x(:), y(:), z(:)]; %3D points
tri = DelaunayTri(v); %triangulation
SI = pointLocation(tri,MatX(:),MatY(:),MatZ(:)); %index of simplex (returns NaN for all points outside the convex hull)
mask = ~isnan(SI); %binary
mask = reshape(mask,size(MatX)); %reshape the mask
end
好了:
%// Points you want to test. Define as you need. This example uses a grid of 1e6
%// points on a cube of sides [-10,10]:
[x y z] = meshgrid(linspace(-10,10,100));
x = x(:);
y = y(:);
z = z(:); %// linearize
%// Ellipsoid data
center = [0 0 0]; %// center
semiaxes = [5 4 3]; %// semiaxes
%// Actual computation:
inner = (x-center(1)).^2/semiaxes(1).^2 ...
+ (y-center(2)).^2/semiaxes(2).^2 ...
+ (z-center(3)).^2/semiaxes(3).^2 <= 1;
以下是一种从椭球体创建二进制遮罩的方法。它创建相应的体积,并将椭球体外部的点(
内部的点)设置为NaN
它不考虑椭球体的公式,而是使用凸壳。实际上,它适用于任何可以由3D凸面外壳正确描述的体积。在这里,由于椭球体已经是凸面外壳,因此跳过了凸面外壳步骤
所有学分归
下面的情节
是由
%DATA
[x, y, z] = ellipsoid(0,0,0,5.9,3.25,3.25,30);
%METHOD
v = [x(:), y(:), z(:)]; %3D points
[X,Y,Z] = meshgrid(min(v(:)):0.1:max(v(:))); %volume mesh
tri = DelaunayTri(v); %triangulation
SI = pointLocation(tri,X(:),Y(:),Z(:)); %index of simplex (returns NaN for all points outside the convex hull)
mask = ~isnan(SI); %binary
mask = reshape(mask,size(X)); %reshape the mask
%PLOT
figure('Color', 'w');
subplot(1,2,1);
s = surf(x,y,z);
title('SURFACE', 'FontSize', 16);
view(-78,22)
subplot(1,2,2);
xslice = median(X(:));
yslice = median(Y(:));
zslice = median(Z(:));
h = slice(X, Y, Z, double(mask), xslice, yslice, zslice)
title('BINARY MASK - SLICE VOLUME', 'FontSize', 16);
set(h, 'EdgeColor','none');
view(-78,22)
几个椭球体
如果有多个椭球,可以对每个椭球使用此遮罩方法,然后将生成的遮罩与&
组合
切片和角度的选择
“正确”是个人的选择。你也可以
- 创建未旋转的遮罩并在()之后旋转它李>
- 在已旋转的椭球体上创建遮罩
- 在稍微旋转的椭球体上创建一个遮罩(可以选择“正确”的切片),然后将其进一步旋转到最终位置李>
就像你只想要plot3(x,y,z)或其他东西一样?您可以使用cat(3,x,y,z),其中3表示3D concat。我无法理解您的解决方案。我在问如何从椭球体制作3D面具。你说的面具是什么意思?过滤器?我不确定是否理解。所谓遮罩,我的意思是:对于ellpisoid内部的所有坐标(x,y,z),遮罩(x,y,z)=0;否则掩码(x,y,z)=1。@Alexandre Bizou您可能对下面适用于任何体积的凸包解决方案感兴趣-Gnovice的解决方案有点像椭球的参数形式:)好主意。@AlexandreBizeau实际上,我在《帮助椭球》(help Ellioid)中看到了它,感谢@ADonda建议使用“线性化”(linearize)一词。谢谢。这正是我想要的。还有一个问题。每个体素如何有一个单位?i、 e.如果我希望我的椭球是以100 x 100 x 20体素^3的周围体积内的体素编号(i,j,k)为中心的6 x 3 x 3体素^3。一种方法是用椭球(0,0,0,6/2,3/2,3/2,30)
定义一个椭球,然后用网格(-49:50,-9:10)
(-49:50
用于100个元素)。由于网格的每个体素都是一个单位体素,因此您的椭球体(x_长度=6)将在x中有6个正元素。非常感谢您的帮助。我试着根据你的建议编写代码。请参阅我的原始文章编辑版本的代码。然而,我仍然有两个问题:1)如果我有两个椭球体,我根据你的建议将它们转换为3D数据点。如何使用它来显示正确大小的环境?2) 另外,我如何确定3D可视化的正确“切片”和角度?在我的代码中,这两个问题都标记为%help:。如果你能回答这些问题,我将不胜感激。二者都
%DATA
[x, y, z] = ellipsoid(0,0,0,5.9,3.25,3.25,30);
%METHOD
v = [x(:), y(:), z(:)]; %3D points
[X,Y,Z] = meshgrid(min(v(:)):0.1:max(v(:))); %volume mesh
tri = DelaunayTri(v); %triangulation
SI = pointLocation(tri,X(:),Y(:),Z(:)); %index of simplex (returns NaN for all points outside the convex hull)
mask = ~isnan(SI); %binary
mask = reshape(mask,size(X)); %reshape the mask
%PLOT
figure('Color', 'w');
subplot(1,2,1);
s = surf(x,y,z);
title('SURFACE', 'FontSize', 16);
view(-78,22)
subplot(1,2,2);
xslice = median(X(:));
yslice = median(Y(:));
zslice = median(Z(:));
h = slice(X, Y, Z, double(mask), xslice, yslice, zslice)
title('BINARY MASK - SLICE VOLUME', 'FontSize', 16);
set(h, 'EdgeColor','none');
view(-78,22)