【问题标题】:Volumetric 3D data plotting from 2D map in MATLAB?从 MATLAB 中的 2D 地图绘制体积 3D 数据?
【发布时间】:2021-01-21 21:22:42
【问题描述】:

我有一张热图

并希望将此 2D 矩阵转换为 3D 体积/形状/表面数据点以进行进一步处理。不只是使用surf 以 3D 形式显示它。

什么是这样做的好方法?

在这个社区的大力帮助下,我可以走得更近:

为了简单起见,我将尺寸缩小到 45x45 像素。

I = (imread("TESTGREYPLASTIC.bmp"))./2+125;
Iinv = 255-(imread("TESTGREYPLASTIC.bmp"))./2-80;%

for i = 1:45
for j = 1:45
A(i, j, I(i,j) ) = 1;
A(i, j, Iinv(i,j) ) = 1;
end
end
volshow(A)

它并不理想,但矩阵是我现在想要的。在处理 1200x1200 点时,也许可以改进循环以更快地运行。

我现在如何创建一个真正的封闭曲面?

【问题讨论】:

  • 我强烈建议针对不同的问题提出不同的问题。这就是 SO 的工作方式,这样做你会得到更好的结果。对于您的性能问题,请再次阅读我的答案。您所需要的只是沿 3 维的不同索引。您将它们保存在一个新变量中,然后让 sub2ind 为您完成剩下的工作。
  • 相邻体素之间的断开直接来自您的数据。当原始图像中的两个相邻像素的强度相差不止一个级别时,就会发生这种情况。您可以使用平滑过滤器来减少它,但这不是可以在离散数据中完全去除的东西。

标签: matlab plot 3d visualization


【解决方案1】:

在您与@BoilermakerRV 的对话之后,我猜您正在寻找以下两个结果之一:

  1. 3d 点列表,其中 x 和 y 是图像中像素的索引,z 是相应像素的值。结果将是一个m*n by 3 矩阵。

  2. 一个由0和1组成的m by n by 256体积,对于图像中的第(i,j)个像素,体积的堆(i,j)的所有体素都是0,除了@处的那个987654329@.

看看下面的例子,它产生了这两种结果:

    close all; clc; clear variables;
    I = rgb2gray(imread('data2.png'));
    imshow(I), title('Data as image') 

    % generating mesh grid
    [m, n] = size(I);
    [X, Y] = meshgrid(1:n, 1:m);

    % converting image to list of 3-d points
    P = [Y(:), X(:), I(:)];
    figure 
    scatter3(P(:, 1), P(:, 2), P(:, 3), 3, P(:, 3), '.')
    colormap jet
    title('Same data as a list of points in R^3')

    % converting image to 256 layers of voxels
    ind = sub2ind([m n 256], Y(:), X(:), I(:));
    V = zeros(m, n, 256);
    V(ind) = 1.0;
    figure
    h = slice(V, [250], [250], [71]) ;
    [h.EdgeColor] = deal('none');
    colormap winter
    camlight
    title('And finally, as a matrix of 0/1 voxels')

【讨论】:

  • 好东西@saastn! @nolimits 是在某处提供了原始图像数据,还是您通过某种图像处理提取了它?我很难理解被问到的内容。我从来没有做过那样的事情。当提到体积这个话题时,我想到的是表面之下的体积。
  • 哇,太酷了! @BoilermakerRV 我的数据就是那张图片:)
  • 刚刚检查过了。我很难将另一个(但不同的)添加到 P 矩阵中,以便在一个矩阵上显示两个不同的图像。 P 似乎仍然是一个 2D 矩阵,并且添加另一个 P1+P2 将每个点的数值相加。
  • 我在原始问题中添加了一些您赞赏的建议的部分结果。请看看:)
  • @BoilermakerRV 我刚刚下载了问题中发布的图像并裁剪了刻度标签;)关于体积,“断层扫描”是关键。就像一个人大脑不同层次的多个 MRI 图像。
【解决方案2】:

显示的等高线图无法使用“2D”数据生成。它需要如下三个输入:

[XGrid,YGrid] = meshgrid(-4:.1:4,-4:.1:4);
C = peaks(XGrid,YGrid);

contourf(XGrid,YGrid,C,'LevelStep',0.1,'LineStyle','none')
colormap('gray')
axis equal

其中XGridYGridC 都是 NxN 矩阵,分别定义每个点的 X 值、Y 值和 Z 值。

如果您希望这是“3D”,只需使用surf

surf(XGrid,YGrid,C)

【讨论】:

  • 谢谢,非常感谢您的回复。我知道我可以使用“冲浪”以 3D 形式显示它,但我需要 2D 地图中的真实体积数据点以进行进一步处理。基本上,将灰度转换为三维?
  • 你是说你没有原始数据?如果您无法获取或重新创建它,您将无法在已有的等高线图上进行某种图像处理。
  • 我确实有数据。但它是一个 2D 地图,一个 X,Y 矩阵。我需要使它成为一个 X、Y、Z 矩阵。也许通过将灰度转换为第三个 Z 维。我需要一个真实的 3D 表面数据点进行进一步处理。
  • 必须有另一个具有 Z(即灰度)值的变量。你能在代码中看到生成原始等高线图的那一行吗?
  • 这是一个二维网格图像,其中每个网格点都有一个 8 位数值。谢谢:)
猜你喜欢
  • 2015-06-15
  • 1970-01-01
  • 2021-06-05
  • 2012-05-25
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
相关资源
最近更新 更多