0

非常に大きなCTデータセットの3Dビューをプロットしようとしています。私のデータは2000x2000x1000次元の3Dマトリックスにあります。オブジェクトは空気に囲まれています。空気は私のマトリックスではNaNに設定されています。

オブジェクトの表面(等値面なし)のグレースケール値を確認できるようにしたいのですが、Matlabでそれを行う方法を完全に理解することはできません。誰か助けてくれませんか?

私が巨大な行列を扱っていて、オブジェクトの表面だけに興味があるとすると、データセットのサイズを小さくするための良いトリックを知っている人はいますか?

4

3 に答える 3

0

関数surf(X、Y、Z)を使用すると、3Dデータをプロットできます。ここで、(X、Y)はxy平面の座標を示し、Zはz座標と表面の色を示します。

デフォルトでは、この関数はNaNエントリに対して何もプロットしないため、surf関数を使用することをお勧めします。

グレースケールプロットを使用するようにsurf-functionを設定するには、次を使用します。

surf(matrix3d);
colormap(gray);

これにより、マトリックスがサーフェスプロットにプロットされ、カラーマップがグレースケールに設定されます。

さらに、私があなたのデータを理解しているように、あなたはあなたのマトリックスの平面セグメント全体を排除することができるかもしれません。たとえば、平面A(1,1:2000,1:1000)がすべてのエントリでNaNである場合、それらのすべてのエントリを削除できます(したがって、エントリX = 1のY、Z平面全体)。ただし、これには重いforループが必要になり、それが上を超える可能性があります。これは、各マトリックスに必要な異なるプロットの数と比較したデータマトリックスの数によって異なります。

于 2012-04-11T11:45:02.377 に答える
0

私はあなたにいくつかのアイデアを与えることを試みます。直接3D「表面検出器」がないことを前提としています。

XY平面がCTスキャンスライスであり、各スライスが画像である3Dマトリックスがあるので、各スライスのエッジをエッジで見つけようとします。これには、各スライス画像の最初のしきい値処理などの前処理が必要になります。次に、scatter3を使用してエッジデータを3Dポイントクラウドとして表示するか、 delaunay3を使用してエッジデータをサーフェスとして表示することができます。

これがあなたが求めていることを達成するのに役立つことを願っています。

于 2012-04-11T14:07:13.907 に答える
0

私はそれをうまく動かすことができました:

function [X,Y,Z,C] = extract_surface(file_name,slice_number,voxel_size)
LT          = imread(file_name);%..READ THE 2D MAP
BW          = im2bw(LT,1);%..THRESHOLD TO BINARY
B           = bwboundaries(BW,8,'noholes');%..FIND THE OUTLINE OF THE IMAGE
X           = B{1}(:,1);%..EXTRACT X AND Y COORDINATES
Y           = B{1}(:,2);
indices     = sub2ind(size(LT),X,Y);%..FIND THE CORRESPONDING LINEAR INDICES
C           = LT(indices);%..NOW READ THE VALUES AT THE OUTLINE POSITION
Z           = ones(size(X))*slice_number;

次に、これをプロットできます

figure
scatter3(X,Y,Z,2,C)

今、私が改善できる唯一のことは、散布図のこれらすべてのポイントをサーフェスに接続することです。@upperBoundあなたはdelaunay3この目的のために提案しました-私はこれを行う方法を完全に理解することはできません。ヒントはありますか?

于 2012-04-16T16:36:35.987 に答える