4

Matlab でサーフェス メッシュから 3D バイナリ マトリックス/イメージを作成するにはどうすればよいですか?

たとえば、次を使用して楕円体を作成する場合:

[x, y, z] = ellipsoid(0,0,0,5.9,3.25,3.25,30);

X、Y、および X はすべて、サイズが 31 x 31 の 2D 行列です。

@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
4

2 に答える 2

4

どうぞ:

%// 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;

n座標がx(n)y(n)z(n)inner(n)あるグリッドの- 番目1の点は、点が楕円体の内部にある場合と0そうでない場合です。

例: 内側の点を描画します。

plot3(x(inner), y(inner), z(inner), '.' , 'markersize', .5)

ここに画像の説明を入力

于 2013-10-17T15:11:35.350 に答える
3

楕円体からバイナリ マスクを作成する方法を次に示します。対応するボリュームを作成しNaN、楕円体の外側 (ones内側) のポイントに設定します。

楕円体の式は考慮されていませんが、凸包が使用されています。実際には、3D 凸包によって正しく記述できる任意のボリュームに対して機能します。ここではconvexhulln、楕円体はすでに凸包であるため、このステップはバイパスされます。

すべてのクレジットは凸包をバイナリ マスクに変換する

次のプロット

ここに画像の説明を入力

によって生成されます

%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)

いくつかの楕円体

複数の楕円体がある場合は、それぞれにこのマスキング方法を使用し、結果のマスクを と組み合わせることができます&

スライスと角度の選択

「正解」は個人の自由です。次のいずれかを実行できます

  • 回転していないマスクを作成し、後で回転させます ( Matlab で 3D 配列を回転する)。
  • すでに回転している楕円体にマスクを作成します。
  • わずかに回転した楕円体上にマスクを作成し (これにより、「正しい」スライスを選択できます)、最終的な位置までさらに回転させます。
于 2013-10-17T20:15:36.880 に答える