【问题标题】:matlab: how to plot multidimensional arraymatlab:如何绘制多维数组
【发布时间】:2026-02-02 03:45:01
【问题描述】:

假设我有 9 MxN 黑白图像,它们在某种程度上彼此相关(即某个事件的时间流逝)。有什么方法可以在一个曲面图上显示所有这些图像?

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

编码是在 MATLAB 中完成的。我看过plot(但它只做2D绘图)和surf,它做3D绘图但不适用于我的MxNx9图像矩阵。我也尝试过contourslice,但不确定要传递什么参数。

谢谢!

玛丽亚

【问题讨论】:

    标签: matlab matrix plot geometry-surface


    【解决方案1】:

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

    我可以看到几种方法。

    您可以使用 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 表示,其中第 3 维表示时间。我的图像只包含线条(所以只有可能的矩阵值是 0 和 1)。我的最终目标是能够跟踪图像中的特定线并确定其路径(或它源自哪个图像)。我希望使用“相邻像素”方法来查看序列中的图像是否在适当的邻域内具有相同的线。但首先我想可视化我的数据。因此,绘制每个 MxN 图像,其中一个图像是前一个图像随时间的进展。从而获得曲面图。
    • @Jonas:取决于绘图大小和内存;几十个,然后在 2 GB RAM 中遇到大约 500x500 的图的内存问题。 MxNx3 形式也应该可以正常工作;用户只需计算绝对颜色值,其中 MxNx1 表单将自动归一化为图形的颜色图。
    • @Myx:据我所知,Matlab 的绘图都不是这样工作的。大多数绘制成 3 维的东西都适用于数据系列或线条,而不是栅格数据。也就是说,它假定您已经知道点关系。 surface() 函数可以让您将每个图像绘制为平面,并将它们作为“时间”第三维中的层。但我不知道如何让它透明化。您还可以通过使用 patch() 将每个单独的“on”像素绘制为 3-D 空间中的多边形来绘制它。我会看看我能不能找出其中的一个。
    • @Myx:patch() 方法非常简单,如果我了解您在寻找什么。请参阅对我的原始答案的编辑。