在 Matlab 中将 3d 矩阵转换为动画 gif 时出错
Error while converting a 3d matrix into an animated gif in Matlab
我正在尝试从 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.movie 进行排列?地图指的是什么?
如何将 0 定义为蓝色,将 100 定义为红色?
您将我们链接到的 post 正好回答了这个问题。 immovie
需要一个 m x n x 1 x k
矩阵,其中 m
和 n
是 3D 矩阵中 1 个切片的行和列,k
是切片的数量。您目前已将 3D 矩阵设置为 m x n x k
。因此,通过置换,您是从 3D 原始矩阵人为地创建 4D 矩阵。简而言之,您可以将 3D 矩阵视为具有单一 4D 维度:m x n x k x 1
。 permute
的工作是 交换 第 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。
我们能做的是找出矩阵中有多少个 unique 值,然后我们可以用这种方式创建颜色图,这样我们就可以确保您的每个值矩阵被分配给一种颜色。但是,这将需要重新定义 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 - 然而,从我在你的 post 中看到的情况来看,制作彩色地图是你想要做的。
我正在尝试从 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.movie 进行排列?地图指的是什么?
如何将 0 定义为蓝色,将 100 定义为红色?
您将我们链接到的 post 正好回答了这个问题。 immovie
需要一个 m x n x 1 x k
矩阵,其中 m
和 n
是 3D 矩阵中 1 个切片的行和列,k
是切片的数量。您目前已将 3D 矩阵设置为 m x n x k
。因此,通过置换,您是从 3D 原始矩阵人为地创建 4D 矩阵。简而言之,您可以将 3D 矩阵视为具有单一 4D 维度:m x n x k x 1
。 permute
的工作是 交换 第 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。
我们能做的是找出矩阵中有多少个 unique 值,然后我们可以用这种方式创建颜色图,这样我们就可以确保您的每个值矩阵被分配给一种颜色。但是,这将需要重新定义 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 - 然而,从我在你的 post 中看到的情况来看,制作彩色地图是你想要做的。