【问题标题】:Matlab: Create 3D cube RGB and show itMatlab:创建 3D 立方体 RGB 并显示它
【发布时间】:2012-08-17 23:01:04
【问题描述】:

我会尽量做到准确和简短。

我有一个体积 (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 建议的另一种方法,我得到了我想要的。 谢谢朋友,我真的很感激,希望这对其他人也有帮助。

【问题讨论】:

  • 你的面具有三个值,那么它们是否对应三种颜色?所以当你最终绘制一个切片时,它只会有三种颜色?您还说您有一个 3D 体积矩阵;那么它包含什么价值呢? (x(i), y(j), z(k)) 位置的密度?或者你的意思是你有一个位置矩阵?在那种情况下,这里的 x、y 和 z 是什么?还是它们只是均匀分布,例如1:128
  • 矩阵,是用 spm_read_vols(spm_vol(path)) 读取一张 nifti 图像的结果,所以它包含了 3D 空间每个位置的亮度值。然后我将有一个带有 3 个不同区域的蒙版,我想以不同的颜色显示它们,每个区域都创建相同的结构,但 RGB 值存储在 3D 中,所以我可以取一片并直接着色。这就像一堆 2D RGB 图像,标记了蒙版,我一次从中取一个。
  • 您必须了解数据和颜色图之间的关系,请仔细阅读文档!我认为我们已经很接近了:你能用N=ceil(max(ovImg(:))) 再试一次吗?
  • 如果我这样做,它只会将所有内容显示为红色(更亮或更暗,但只是红色)。
  • 还要注意蓝色不是透明的,我看不到它下面的东西

标签: matlab 3d matrix show rgb


【解决方案1】:

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

要绘制 3d 矩阵的切片,您只需对其进行索引,然后 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))))

带有掩码的结果(上面的代码块):

对于不同的颜色图,请参阅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);

给出:

其他方法:

现在我明白了你的问题,我看到你从一开始就很正确,你只需要将变量重新调整为 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,:)))

【讨论】:

  • 我刚刚尝试了您的代码并理解了您的解释,但我有一些疑问,我希望它没有要求太多。我在透明度和颜色方面遇到了一些问题,我用一些图片更新了我的帖子,这样你就可以看到发生了什么。我非常非常感谢你,感谢你的时间和回答,我真的很感激。
  • 好的,现在这绝对是完美的。再次感谢,你一直非常乐于助人:) 谢谢
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多