2015-06-24 88 views
0

我一直在研究modyfing dicom圖像,所以我可以在以後3D打印它們。問題在於,一旦我修改了單個切片以將它們轉換爲.stl文件,我正在使用的軟件(Osirix)會提示請求獲取大量數據的錯誤。如果我在MAtlab中首先嚐試渲染.stl而不進行修改,則不會收到錯誤消息。如何從2D圖像創建3D表面?

我需要一個用於Matlab的代碼示例,它可以將2d圖像堆疊到3d表面中,以便稍後將其導入到.stl文件。誰能幫我?

回答

0

一種方法可能是將二維圖像疊加到三維圖像立方體中。

溶液1 以下解決方案是基於在以下假設: 1)所有二維圖像的大小是相同的:n1n2 2)你知道圖像的數量(片) :n3 3),該圖像是uint8

你可以事先創建一個3D立方體:

allImgs = uint8(zeros(n1, n2, n3)); 

然後以填充第一切片與aSlice圖像,執行:

allImgs(:, :, 1) = aSlice; 

對於第二個,這樣做:

allImgs(:, :, 2) = anotherSlice; 

等等。

如果你有一個函數(如getMeASlice())是可以獲得切片適合你,你可以有效地從調用此for循環,並填寫起來:

for k = 1:n3 
    allImgs(:, :, k) = getMeASlice(your_params); 
end 

解決方案2. 你可以串連切片隨你走。說你讀片:

aSlice = imread('cameraman.tif'); 

,然後你以後你的代碼讀取另一片並希望將它疊加到現有的,你可以這樣做:

aSlice = cat(3, aSlice, imread('anotherimage.jpg')); 

其串接新在第三維中切片。只要你需要,你可以繼續這樣做。

但是,請注意以下幾點。與預先分配變量並添加事物(填充)這種變量相比,連接速度非常慢。舉例來說,如果你比較以下兩個腳本,第二個是要慢得多:

n1=256; n2=256; n3=200; 
allImgs = uint8(zeros(n1, n2, n3)); 
aSlice = imread('cameraman.tif'); 

tic; 
for k=1:n3 
    allImgs(:,:,1)=aSlice; 
end 
fprintf(['Total time is: ' num2str(toc) '\n']); 

tic; 
allImgs=aSlice; 
for k=2:n3 
    allImgs=cat(3, allImgs, aSlice); 
end 
fprintf(['Total time is: ' num2str(toc) '\n']); 

給出我的電腦下面:

Total time is: 0.0085632 
Total time is: 0.89103 

讓我知道,如果這有助於與否。