2015-10-09 23 views
1

我正在嘗試從3d矩陣製作電影,該3d矩陣製作了多個2d矩陣,第三個維度是時間。在Matlab中將3d矩陣轉換爲動畫gif時出現錯誤

我已閱讀以下問題女巫幾乎相同,我也試圖做同樣的事情。 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定義爲紅色?

回答

1

您將我們鏈接到的確切答案。 immovie預計m x n x 1 x k矩陣,其中mn是來自3D矩陣的1個切片的行和列,並且k是切片的數量。您目前的3D矩陣設置爲m x n x k。因此,通過排列,您可以從3D原始矩陣中人爲創建一個4D矩陣。簡而言之,您可以將您的3D矩陣視爲具有單一四維維度:m x n x k x 1permute這裏的工作是swap第三和第四維 - 這就是爲什麼你在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 - 但是,從我在帖子中看到的內容,製作彩色地圖就是您想要做的事情。

+0

你不能使用內置的[colormap](http://www.mathworks.com/help/matlab/ref/colormap.html#inputarg_map)嗎? – beaker

+0

@beaker yup ...其實這個人可以使用'jet' :( – rayryeng

+0

Noooo ...除jet之外的任何東西!我可以讓你感興趣的是一個不錯的'parula'嗎?或者'cool'?:) – beaker