在 MATLAB 中从 2D 地图绘制体积 3D 数据?
Volumetric 3D data plotting from 2D map in MATLAB?
我有一张热图
并希望将此 2D 矩阵转换为 3D volume/shape/surface 数据点以供进一步处理。不是简单地使用 surf
.
以 3D 显示它
执行此操作的好方法是什么?
在这个社区的大力帮助下,我可以更接近:
为了简单起见,我将尺寸运行k 设置为 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 点时可以将循环改进到 运行 更快。
我现在如何创建一个真正的封闭曲面?
无法使用“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
其中XGrid
、YGrid
和C
都是NxN矩阵,分别定义了每个点的X值、Y值和Z值。
如果您希望它是“3D”,只需使用 surf
:
surf(XGrid,YGrid,C)
在您与@BoilermakerRV 的对话之后,我猜您正在寻找以下两个结果之一:
一个3d点的列表,其中x和y是图像中像素的索引,z是对应像素的值。结果将是一个 m*n by 3
矩阵。
m by n by 256
零和一的体积,对于图像中的第 (i,j) 个像素,第 (i,j) 堆的所有体素音量为 0,除了 I(i, j)
.
处的那个
查看以下生成两个结果的示例:
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')
我有一张热图
并希望将此 2D 矩阵转换为 3D volume/shape/surface 数据点以供进一步处理。不是简单地使用 surf
.
执行此操作的好方法是什么?
在这个社区的大力帮助下,我可以更接近:
为了简单起见,我将尺寸运行k 设置为 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 点时可以将循环改进到 运行 更快。
我现在如何创建一个真正的封闭曲面?
无法使用“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
其中XGrid
、YGrid
和C
都是NxN矩阵,分别定义了每个点的X值、Y值和Z值。
如果您希望它是“3D”,只需使用 surf
:
surf(XGrid,YGrid,C)
在您与@BoilermakerRV 的对话之后,我猜您正在寻找以下两个结果之一:
一个3d点的列表,其中x和y是图像中像素的索引,z是对应像素的值。结果将是一个
m*n by 3
矩阵。
处的那个m by n by 256
零和一的体积,对于图像中的第 (i,j) 个像素,第 (i,j) 堆的所有体素音量为 0,除了I(i, j)
.
查看以下生成两个结果的示例:
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')