2016-02-29 1 views
0

Матовый файл представляет собой трехмерную матрицу размером 156 * 192 * 25. Данные представляют собой серию из n = 25 изображений в файле мата. Как преобразовать эту трехмерную матрицу в 25 2D-матрицу и отобразить их независимо? Благодаря ~Как преобразовать трехмерную матрицу в несколько 2D-матриц?

+1

у вас есть уже 25 2D матрицы! вы можете вызвать n-й, используя 'varname (:,:, n)' ... литье в массив ячеек и т. д. просто бесполезно! – bla

+0

Если один из ответов разрешил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), нажав галочку. Это означает, что вы нашли решение, и это уже не открытый вопрос. Если на ваш вопрос не ответил, пожалуйста, объясните, чего не хватает. – Daniel

ответ

5

Я рекомендую не разделить стек изображений, а не просто использовать I(:,:,3), если вы, например, нужно третье изображение.

Для отображения изображений, которые можно использовать:

montage(permute(I,[1,2,4,3])) 

Чтобы отобразить все изображения вместе. Переменная необходима, потому что montage ожидает 156*192*1*25 для изображений с серой шкалой, третье измерение зарезервировано для цветовых каналов. В качестве альтернативы для отображения индивидуального использования изображения:

imshow(I(:,:,3)); 

Чтобы сохранить каждое изображение для индивидуального использования мата файла:

for ix=1:size(I,3) 
    M=matfile(sprintf('image%03d',ix),'writable',true); 
    M.image=I(:,:,ix); 
end 
+0

Большое спасибо. Я мог использовать I (:,:, t), чтобы получить текущие x-y 2D-данные. Кроме того, я хочу сохранить эти 2D-данные в разных независимых файлах матов во время цикла for (для разных стеков). Можете ли вы дать некоторое предложение о том, как сохранить текущие 2D-данные в файле мата во время цикла for? – Echo0831

+0

Я обновил свой ответ, но перед его использованием вам действительно нужно разделить ваш набор данных? Используя 'matfile', вы также можете хранить все данные в одном файле и загружать только соответствующие части. – Daniel

1

Использование команды mat2cell, можно преобразовать матрицу 3D значение в массиве 25 клеток, где каждая ячейка хранит матрицу 156x192 2D значение:

M = rand(156,192,25); %// simulate your 3D data matrix 

Mcell = mat2cell(M,156,192,ones(1,25)); 

В качестве альтернативы, используя arrayfun команду:

Mcell = arrayfun(@(x) M(:,:,x), 1:25, 'UniformOutput', false) 

Теперь вы можете получить доступ к 25 изображения по одному, как:

imageNum = 5;   %// example: access image num. 5 
image = Mcell{imageNum}; %// image: 156x192 value matrix 

Одним из преимуществ хранения изображений в массиве ячеек является то, что вы можете легко применить, например. тот же фильтр для всех изображений, что делает использование команды cellfun, например .:

h = fspecial('motion', 50, 45); 
McellFiltered = cellfun(@(x) imfilter(x, h), Mcell, ... 
    'UniformOutput', false);