2012-04-11 19 views
0

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

オブジェクトのサーフェスのグレースケール値(アイソサーフェスはありません)を見ることができますが、Matlabでそれを行う方法はかなりわかりません。誰も私を助けることができますか?

私は巨大な行列を扱い、私はオブジェクトの表面だけに興味があるとすれば、誰も私のデータセットのサイズを減らす方法を知っていますか?

答えて

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) 

でこれをプロットすることができます表面。あなたがこの目的のためにdelaunay3を提案した@upperBound - これをどうやってどうやって解決するのか分かりません。あなたはヒントを持っていますか?

+0

これは、 'tri = delaunay(X、Y);'の後ろに 'trisurf(tri、X、Y、Z、C、 'EdgeAlpha'、0、 'FaceColor'、 'interp')'が続きます。しかし、結果として生じるサーフェスにはアーチファクトがあり、このメッセージが表示されます: "警告:重複したデータポイントが検出されました 三角測量の頂点にマップされないデータポイントがあります この現象を回避するには、 DELAUNAYを呼び出す前のデータポイント "これは、おそらく、異なるスライスの輪郭が、隣接するzスライス間のxおよびy座標においてかなり類似しているからである。私はUNIQUEを使用できません。何ができますか?何かヒントありがとう。 –

0

関数surf(X、Y、Z)は3Dデータをプロットすることができます。ここで(X、Y)はx-y平面上の座標を与え、Zはz座標および表面色を与えます。

デフォルトでは、この関数はNaNエントリのために何もプロットしません。したがって、surf関数を使うのがよいでしょう。

surf(matrix3d); 
colormap(gray); 

これは、表面プロットでマトリックスをプロットし、グレースケールにカラーマップを設定します。使用をプロットし、グレースケールを使用するサーフ機能を設定する

また、私があなたのデータを理解しているので、あなたのマトリックスの平面セグメント全体を排除することができるかもしれません。たとえば、すべてのエントリで平面A(1,1:2000,1:1000)がNaNの場合、これらのエントリをすべて削除できます(したがって、エントリXのZ平面全体が1になります)。しかし、これはいくつかの重いループを必要とします。これは、いくつのデータ行列をあなたが各行列に対してどれだけの異なるプロットにするかと比べて、どれだけの数のデータ行列に依存します。

0

私はあなたにいくつかのアイデアを提供しようとします。私は、直接3Dの "表面検出器"がないと仮定します。

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

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

+0

ありがとう、私はこのアプローチが私のためにうまくいくと思います。私はdelaunay3を使ってエッジデータを構築しようとします。私が取り組まなければならないもう一つの課題は、私のオブジェクトが中空で、外側のサーフェス/エッジ(プロットする点の数を減らして視覚化をスピードアップする必要がある)だけです。良い解決策を見つけたら、私は周りを見てスレッドに戻ります。 –

関連する問題