【问题标题】:Error while converting a 3d matrix into an animated gif in Matlab在 Matlab 中将 3d 矩阵转换为动画 gif 时出错
【发布时间】:2016-01-07 15:55:17
【问题描述】:

我正在尝试从 3d 矩阵制作电影,该矩阵由多个 2d 矩阵组成,第三维是时间。

我已经阅读了以下问题,女巫几乎相同,我也尝试过这样做。 How to make a video from a 3d matrix in matlab

我要播放的 3d 矩阵存储在对象实例 A 中。

a.movie; % 3D matrix
X = permute(a.movie,[1 2 4 3]); % 4D matrix
movie = immovie(X,map); % map is the colormap you want to use
implay(movie);

我想知道为什么要置换 a.movi​​e?地图指的是什么?

如何将 0 定义为蓝色,将 100 定义为红色?

【问题讨论】:

    标签: image matlab image-processing gif animated-gif


    【解决方案1】:

    您链接到我们的帖子正好回答了这个问题。 immovie 需要一个 m x n x 1 x k 矩阵,其中 mn 是 3D 矩阵中 1 个切片的行和列,k 是切片数。您当前将 3D 矩阵设置为 m x n x k。因此,通过置换,您是从 3D 原始矩阵人为地创建 4D 矩阵。简单地说,您可以将您的 3D 矩阵视为具有单例 4D 维度:m x n x k x 1permute 的工作是交换第 3 维和第 4 维 - 这就是您在 permute 调用中看到 [1 2 4 3] 向量的原因。第一个和第二个维度代表行和列,您可以将它们留空。


    现在回答了permute 的问题。 map 被定义为彩色图。这会将 3D 矩阵中的每个值映射到唯一的颜色。基本上,颜色图是一个M x 3 矩阵,其中该矩阵中的行对应于一种独特的颜色。每列代表一个颜色通道。因此,第一列代表你想要的红色比例,第二个通道是绿色的比例,最后一个是蓝色的比例。请记住,这些颜色应在[0,1] 之间进行标准化。

    颜色映射的目标是获取 3D 矩阵中的每个值,并确定该值映射到哪种颜色。这样做的方法是完全按原样使用 3D 矩阵中的每个值,并使用它来访问颜色图的 。此行为您提供所需的颜色。现在,我假设您在 3D 矩阵中的值介于 0 到 100 之间。

    如果您希望颜色介于蓝色和红色之间。假设归一化坐标,蓝色的精确颜色为RGB = (0,0,1),类似地,红色代表RGB = (1,0,0) 的精确颜色。因此,从RGB = (0,0,1)开始,然后开始线性增加红色分量,同时线性减少蓝色分量,直到红色为1,蓝色为0。

    我们可以做的是找出矩阵中有多少个唯一值,然后我们可以这样创建我们的颜色图,这样我们就可以确保矩阵中的每个值都分配给一个颜色。但是,这将需要重新定义 a.movie 以确保我们可以为颜色分配值。

    因此,我会像这样创建您的颜色图:

    [unq,~,id] = unique(a.movie);
    movie_IDs = reshape(id, size(a.movie));
    M = numel(unq);
    map = [linspace(1,0,M).', zeros(M,1), linspace(0,1,M).'];
    

    现在,继续使用map 和上面的代码来创建您的电影。

    X = permute(movie_IDs,[1 2 4 3]); % 4D matrix
    movie = immovie(X,map); % map is the colormap you want to use
    implay(movie);
    

    但是,您正在查看的颜色图是jet 颜色图。因此,您可以简单地创建一个jet 色图:

    map = jet(M);
    

    但是,您必须确保遍历 a.movie 中的每个值,并为每个值分配一个唯一的整数,以确保您的数据中没有间隙,并且每个值都被分配给一个从 1 开始上升的新值到M 以使电影正确访问正确的颜色。

    如果您不想设计自己的颜色图,MATLAB 有一堆内置的颜色图供您使用。 http://www.mathworks.com/help/matlab/ref/colormap.html#inputarg_map - 但是,根据我在您的帖子中看到的,制作彩色地图是您想要做的。

    【讨论】:

    • 你不能使用内置的colormap吗?
    • @beaker 是的...事实上这个人可以使用jet :(
    • 不...除了喷气机!我可以给你一个很好的parula 吗?或者cool? :)
    • @beaker OP希望蓝色映射到0,红色映射到100...我假设这是数据的动态范围...jet是我最接近的东西可以找到这样做,尽管行为是相反的:( lol
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多