Matlab:创建3D立方体RGB并显示它

时间:2012-08-17 23:01:04

标签: matlab 3d matrix show rgb

我会尽量精确而简短。

我有一个体积(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)));

结果(覆盖图像/蒙版) Overlayed and mask picture 有任何想法吗?再次感谢大家


最终更新: 使用Gunther Struyf建议的另一种方法,我完全得到了我想要的东西。 谢谢你的配偶,我真的很感激,希望这对其他人也有帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用imshowcolormap来伪造来自灰度图像(您拥有)的RGB图像。对于比例我不会将其相乘,而是为该值添加偏移量,因此每个蒙版在颜色图中都是不同的范围。

为绘制三维矩阵的切片,您只需将其编入索引,然后squeeze即可删除生成的单个维度:

示例:

[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)))

enter image description here

导致掩码(上面的代码块):

enter image description here

对于不同的色彩映射,请参阅here,或创建自己的色彩映射表。例如,你的面具有三个值,所以让我们匹配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);

给出:

enter image description here

其他方法:

现在我理解你的问题,我发现你从一开始就做得很好,你只需要将变量重新调整为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,:)))