2012-04-11 124 views
0

我想繪製一個非常大的CT數據集的3d視圖。我的數據是2000x2000x1000尺寸的3d矩陣。物體被空氣包圍,在我的矩陣中被設置爲NaN。Matlab三維索引數據圖

我希望能夠看到物體表面的灰度值(無isosurface),但我無法完全解決如何在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) 

繪製這個現在我可以提高的唯一的事情就是在與相連的散點圖所有這些問題一個表面。 @upperBound你建議delaunay3爲此 - 我不能完全弄清楚如何做到這一點。你有小費嗎?

+0

好的,這似乎工作'tri = delaunay(X,Y);'接着是'trisurf(tri,X,Y,Z,C,'EdgeAlpha',0,'FaceColor','interp')'。@upperBound:然而,產生的表面有文物,我得到這樣的信息: 「警告:檢測到重複的數據點 某些數據點不映射到三角測量中的頂點 要避免這種情況,請調用UNIQUE打電話給DELAUNAY之前的數據點。「這大概是因爲不同切片中的輪廓在相鄰z切片之間的x和y座標上非常相似。我無法使用UNIQUE,我該怎麼辦?感謝任何提示。 – 2012-04-25 10:45:35

0

函數surf(X,Y,Z)允許您繪製三維數據,其中(X,Y)給出x-y平面中的座標,而Z給出z座標和表面顏色。

默認情況下,該函數不會爲NaN條目繪製任何內容,因此您應該非常樂意使用surf功能。

要設置衝浪功能使用一個灰度繪圖使用:

surf(matrix3d); 
colormap(gray); 

此圖表中的表面圖的矩陣,並且將顏色映射爲灰度。

此外,據我瞭解您的數據,您可能能夠消除矩陣中的整個平面段。如果例如平面A(1,1:2000,1:1000)在所有條目中都是NaN,則可以消除所有這些條目(因此條目X = 1中的整個Y,Z平面)。然而,這將需要一些重循環,這可能會超過頂部。這取決於您有多少個數據矩陣,而不是每個矩陣需要多少個不同的繪圖。

0

我會盡力給你一些想法。我假設缺乏直接的3D「表面探測器」。

既然你有一個3D矩陣,其中XY平面是CT掃描切片,每個切片都是圖像,我會試着找到每個切片的邊緣,用edge表示。這需要進行一些預處理,如首先對每個切片圖像進行閾值處理。然後,我可以使用scatter3將邊緣數據顯示爲3D點雲或delaunay3以將邊緣數據顯示爲曲面。

我希望這會幫助你達到你所要求的。

+0

謝謝,我認爲這種方法對我來說可能很好。我會嘗試使用delaunay3構造邊緣數據。我需要解決的另一個挑戰是我的對象是空心的,我只想要外部表面/邊緣(這應該減少繪製點的數量並加快可視化)。如果我找到了一個好的解決方案,我將環顧四周並回到線程。 – 2012-04-13 10:08:12