matlab:如何绘制多维数组

matlab:如何绘制多维数组,matlab,matrix,plot,geometry-surface,Matlab,Matrix,Plot,Geometry Surface,假设我有9个MxN黑白图像,它们以某种方式相互关联(即某个事件的时间推移)。我可以用什么方法在一个曲面图上显示所有这些图像 假设MxN矩阵仅包含0和1。假设图像仅包含黑色背景上的白线(即,如果像素是线的一部分,则像素值==1,否则为0)。假设图像的排列方式表明后续图像中线条的移动进度。我希望能够看到这些图像的“侧视图”(或体积表示),它将显示特定直线在图像中移动时“雕刻”出来的曲面 编码是在MATLAB中完成的。我已经看过了绘图(但它只做2D绘图)和冲浪,它做3D绘图,但不适用于我的MxNx9图

假设我有9个MxN黑白图像,它们以某种方式相互关联(即某个事件的时间推移)。我可以用什么方法在一个曲面图上显示所有这些图像

假设MxN矩阵仅包含0和1。假设图像仅包含黑色背景上的白线(即,如果像素是线的一部分,则像素值==1,否则为0)。假设图像的排列方式表明后续图像中线条的移动进度。我希望能够看到这些图像的“侧视图”(或体积表示),它将显示特定直线在图像中移动时“雕刻”出来的曲面

编码是在MATLAB中完成的。我已经看过了
绘图
(但它只做2D绘图)和
冲浪
,它做3D绘图,但不适用于我的MxNx9图像矩阵。我还尝试过使用
轮廓切片
,但不确定要传递哪些参数

谢谢


玛丽亚

这些图像是黑白的,在“空白”区域上有简单的特征,还是灰度,信息更密集

我可以看到一些方法

可以使用movie()将一系列图像显示为动画

对于稀疏、简单数据的静态视图,可以将每个图像绘制为单个图形中的一个单独图层,为每个图层提供不同的前景颜色,并使用AlphaData使背景透明,以便序列中的所有步骤都显示出来。颜色的梯度对应于图像序列中的位置。这里有一个例子

function plotImageSequence

% Made-up test data
nLayers = 9;
x = zeros(100,100,nLayers);
for i = 1:nLayers
    x(20+(3*i),:,i) = 1;
end

% Plot each image as a "layer", indicated by color
figure;
hold on;
for i = 1:nLayers
    layerData = x(:,:,i);
    alphaMask = layerData == 1;
    layerData(logical(layerData)) = i; % So each layer gets its own color
    image('CData',layerData,...
        'AlphaData',alphaMask,...
        'CDataMapping','scaled');
end
hold off
使用光栅数据很难直接显示“线”切割出的移动路径,因为Matlab不知道两幅后续图像中哪些“移动”像素相互关联。难道你没有图像中几何特征的基本矢量数据吗?Plot3()可能允许您以时间为z轴显示它们的移动。或者可以使用常规plot()和一些手动摆弄来绘制几何特征中所有控制点或顶点的路径


编辑:这里有一个变体,它使用patch()将每个像素绘制为一个小多边形,浮动在图像序列中其索引的Z级别的空间中。我认为这将看起来更像你所要求的“表面”样式的绘图。您可以修改FaceAlpha属性,使密集的绘图更清晰

function plotImageSequencePatch

% Made-up test data
nLayers = 6;
sz = [50 50];
img = zeros(sz(1),sz(2),nLayers);
for i = 1:nLayers
    img(20+(3*i),:,i) = 1;
end

% Plot each image as a "layer", indicated by color
% With each "pixel" as a separate patch
figure;
set(gca, 'XLim', [0 sz(1)]);
set(gca, 'YLim', [0 sz(2)]);
hold on;
for i = 1:nLayers
    layerData = img(:,:,i);
    [x,y] = find(layerData);  % X,Y of all pixels
    % Reshape in to patch outline
    x = x';
    y = y';
    patch_x = [x; x+1; x+1; x];
    patch_y = [y; y; y+1; y+1];
    patch_z = repmat(i, size(patch_x));

    patch(patch_x, patch_y, patch_z, i);
end
hold off

Matlab可以处理多少层?我通常只是简单地将不同“层”的RGB值添加到一个mxnx3数组中。我希望有一个2D图像的3D表示,其中第三维表示时间。我的图像只包含行(因此只有可能的矩阵值是0和1)。我的最终目标是能够跟踪图像中的特定线条,并确定其路径(或者它来自哪个图像)。我希望使用“相邻像素”的方法来查看序列中的图像是否在适当的邻域内具有相同的线条。但首先我想将我的数据可视化。所以,绘制每个MxN图像,其中一个图像是前一个图像随时间的推移而变化。从而获得曲面图。@Jonas:取决于图的大小和内存;在2 GB RAM中500x500左右的绘图出现内存问题之前,会出现几十个问题。MxNx3表单也应该可以正常工作;用户只需计算绝对颜色值,其中MxNx1表单将自动标准化到图形的颜色映射中。@Myx:据我所知,没有一个Matlab绘图是这样工作的。大多数绘制成三维的东西都是在数据系列或数据线上工作的,而不是光栅数据。也就是说,它假定您已经知道点关系。使用surface()函数可以将每个图像绘制为一个平面,并将其作为“时间”三维中的层。但我不知道如何让它在上面透明。您还可以使用patch()将每个单独的“on”像素绘制为三维空间中的多边形来绘制它。我来看看是否能找到其中一个。@Myx:patch()方法非常简单,如果我了解您要找的是什么。请参见编辑我的原始答案。