Матовый файл представляет собой трехмерную матрицу размером 156 * 192 * 25. Данные представляют собой серию из n = 25 изображений в файле мата. Как преобразовать эту трехмерную матрицу в 25 2D-матрицу и отобразить их независимо? Благодаря ~Как преобразовать трехмерную матрицу в несколько 2D-матриц?
ответ
Я рекомендую не разделить стек изображений, а не просто использовать 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
Большое спасибо. Я мог использовать I (:,:, t), чтобы получить текущие x-y 2D-данные. Кроме того, я хочу сохранить эти 2D-данные в разных независимых файлах матов во время цикла for (для разных стеков). Можете ли вы дать некоторое предложение о том, как сохранить текущие 2D-данные в файле мата во время цикла for? – Echo0831
Я обновил свой ответ, но перед его использованием вам действительно нужно разделить ваш набор данных? Используя 'matfile', вы также можете хранить все данные в одном файле и загружать только соответствующие части. – Daniel
Использование команды 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);
у вас есть уже 25 2D матрицы! вы можете вызвать n-й, используя 'varname (:,:, n)' ... литье в массив ячеек и т. д. просто бесполезно! – bla
Если один из ответов разрешил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), нажав галочку. Это означает, что вы нашли решение, и это уже не открытый вопрос. Если на ваш вопрос не ответил, пожалуйста, объясните, чего не хватает. – Daniel