簡體   English   中英

索引數據的 Matlab 3d plot

[英]Matlab 3d plot of indexed data

我正在嘗試 plot 一個非常大的 CT 數據集的 3d 視圖。 我的數據位於 2000x2000x1000 維度的 3d 矩陣中。 object 被空氣包圍,在我的矩陣中設置為 NaN。

我希望能夠看到 object(無等值面)表面的灰度值,但我不太清楚如何在 Matlab 中做到這一點。有人可以幫我嗎?

鑒於我正在處理一個巨大的矩陣,而且我只對 object 的表面感興趣,有沒有人知道如何減少我的數據集大小的好技巧?

function surf(X,Y,Z) 允許您訪問 plot 3d 數據,其中 (X,Y) 給出 xy 平面中的坐標,而 Z 給出 z 坐標和表面顏色。

默認情況下,function 不會為 NaN 條目提供任何 plot,因此您應該使用沖浪 function 來訪問 go。

要將 surf-function 設置為使用灰度繪圖,請使用:

surf(matrix3d);
colormap(gray);

這將在表面 plot 中繪制矩陣並將顏色圖設置為灰度。

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

我會嘗試給你一些想法。 我假設缺少直接 3D “表面檢測器”。

由於您有一個 3D 矩陣,其中 XY 平面是 CT 掃描切片,每個切片是一個圖像,所以我會嘗試找到每個切片的邊緣,比如edge 這將需要一些預處理,例如首先對每個切片圖像進行閾值處理。 然后我可以使用scatter3將邊緣數據顯示為 3D 點雲或delaunay3將邊緣數據顯示為表面。

我希望這將幫助您實現您的要求。

我設法讓它工作:

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;

然后我可以用 plot 這個

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

現在我唯一可以改進的是讓散點 plot 中的所有這些點都與一個曲面相連。 @upperBound 你為此建議了delaunay3 - 我不太清楚如何做到這一點。 你有小費嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM