簡體   English   中英

Matlab:創建3D立方體RGB並顯示它

[英]Matlab: Create 3D cube RGB and show it

我會盡量准確而簡短。

我有一個體積(128x128x128)和一個掩碼(相同大小,[0 | 1 | 2]值)

我想讓3D體積矩陣成為帶有RGB的3D圖像,並在每個通道(紅色,綠色,藍色)中存儲掩模中標記的點。

這是通過拍攝3D立方體片段來使用2D表示,而不是一遍又一遍地計算它以使事情變得更快(在我的項目中非常重要),所以實際上,3D體積+ rgb就像一個商店適用於128個2D圖像。

問題是,我需要完成以下步驟: - 創建一個128x128x128x3卷? - 定義新的色彩圖(原件是灰色的)? - 加入每個頻道? - 如何使用imagesc / whatever來顯示該多維數據集的一個切片,並在掩碼中標記顏色中的點(例如:imageRGB(:,:,64))?

這只是我的猜測,但我甚至不知道如何正確地做到這一點......我有點失落,我希望你能幫助我,這是一段可能有問題的代碼但可能會幫助你

% Create the matrix 4D
ovImg = zeros(size(volImg,1),size(volImg,2),size(volImg,3),3);    % 128x128x128x3
% Store in each channel the points marked as groups
ovImg(:,:,:,1) = volImg .* (mask==1);
ovImg(:,:,:,2) = volImg .* (mask==2);
ovImg(:,:,:,3) = volImg .* (mask==3);

非常感謝!!

更新:

我在透明度和色彩映射方面遇到了一些麻煩,這就是我所做的。

% Create the matrix 4D
ovImg = zeros(size(volImg,1),size(volImg,2),size(volImg,3),3);
% Store in each channel the points marked as groups
ovImg(:,:,:,1) = imaNorm.*(mask==1);
ovImg(:,:,:,2) = imaNorm.*(mask==2);
ovImg(:,:,:,3) = imaNorm.*(mask==3);

[X,Y,Z] = meshgrid(1:128,1:128,1:128);
imaNorm = volImg - min(volImg(:));   
maxval = max(imaNorm(:));        
ovImg  = imaNorm + mask * maxval;


N= ceil(maxval);
c = [linspace(0,1,N)' zeros(N,2)];
my_colormap = [c(:,[1 2 3]) ; c(:,[3 1 2]) ; c(:,[2 3 1])];

figure;
imshow(squeeze(ovImg(:,:,64)),my_colormap);

figure;
imagesc(squeeze(mask(:,:,64)));

結果(覆蓋圖像/掩碼) 疊加和掩碼圖片 有任何想法嗎? 再次感謝大家


最終更新:根據Gunther Struyf提出的另一種方法,我完全得到了我想要的東西。 謝謝你的伴侶,我真的很感激,希望這對其他人也有幫助。

您可以使用imshowcolormap從灰度圖像(你有)中“偽造”RGB圖像。 對於比例,我不會將其相乘,而是為該值添加偏移量,因此每個蒙版在顏色圖中都是不同的范圍。

為了繪制三維矩陣的切片,您可以其索引,然后擠壓以移除生成的單個維度:

例:

[X,Y,Z]=meshgrid(1:128,1:128,1:128);
volImg =5*sin(X/3)+13*cos(Y/5)+8*sin(Z/10);
volImg=volImg-min(volImg(:));
mask = repmat(floor(linspace(0,3-2*eps,128))',[1 128 128]);

maxval=max(volImg(:));
ovImg=volImg+mask*maxval;
imshow(squeeze(ovImg(:,:,1)),jet(ceil(max(ovImg(:)))));

未掩蓋的原始圖像( imshow(squeeze(volImg(:,:,1)),jet(ceil(maxval)))

在此輸入圖像描述

導致掩碼(上面的代碼塊):

在此輸入圖像描述

有關不同的色彩映射,請參閱此處 ,或創建自己的色彩映射表。 例如,你的面具有三個值,所以讓我們匹配R,G和B:

N = ceil(maxval);
c = [linspace(0,1,N)' zeros(N,2)];
my_colormap = [c(:,[1 2 3]) ; c(:,[3 1 2]) ; c(:,[2 3 1])];
figure
imshow(squeeze(ovImg(:,:,1)),my_colormap);

這使:

在此輸入圖像描述

其他方法:

現在我明白了你的問題,我發現你從一開始就做得很好 ,你只需要將變量重新調整為0到1之間的值,因為從imshow

可以在0.0到1.0的間隔內指定顏色強度。

您可以使用以下方法:

minval=min(volImg(:));
maxval=max(volImg(:));
volImg=(volImg-minval)/(maxval-minval);

接下來是你的代碼:

ovImg = zeros([size(volImg),3]);
ovImg(:,:,:,1) = volImg .* (mask==1);
ovImg(:,:,:,2) = volImg .* (mask==2);
ovImg(:,:,:,3) = volImg .* (mask==3);

你只需要現在繪制它:

imshow(squeeze(ovImg(:,:,64,:)))

暫無
暫無

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

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