[英]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提出的另一種方法,我完全得到了我想要的東西。 謝謝你的伴侶,我真的很感激,希望這對其他人也有幫助。
您可以使用imshow和colormap從灰度圖像(你有)中“偽造”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.