Этого можно добиться, используя стандартные функции load
и save
.Посмотрите на этот код:
image_dir = pwd;
save_dir = pwd;
imds = imageDatastore(image_dir,'FileExtensions',{'.jpg','.tif'});
pxds = pixelLabelDatastore(save_dir,{'nothing','something'},[0 255]);
save('images.mat','imds', 'pxds')
clear
load('images.mat') % gives you the variable "imds" and "pxds" directly -> might override previous variables
tmp = load('images.mat'); % saves all variables in a struct, access it via tmp.imds and tmp.pxds
Если вы хотите выбрать только те переменные, которые хотите загрузить, используйте:
load('images.mat','imds') % loads "imds" variable
load('images.mat','pxds') % loads "pxds" variable
load('images.mat','imds','pxds') % loads both variables
РЕДАКТИРОВАТЬ
Теперь у меня проблема, но я боюсь, что это не так.Идея, лежащая в основе объектов Datastore
, заключается в том, что они используются, если данные слишком велики, чтобы поместиться в памяти в целом, но каждый маленький кусочек достаточно мал, чтобы поместиться в памяти.Вы можете использовать объект Datastore
, чем легко обрабатывать и читать несколько файлов на диске.Для вас это означает: просто сохраняйте изображения не как один большой *mat
файл, а как несколько маленьких *.mat
файлов, которые содержат только одно изображение.
РЕДАКТИРОВАТЬ 2
Строго ли необходимо использовать imageDatastore
для этой задачи?Если нет, вы можете использовать что-то вроде следующего:
image_dir = pwd;
matFiles = dir([image_dir '*.mat']);
for i=1:length(matFiles)
data = load(matFiles(i).name);
img = convertMatToImage(data); % write custom function which converts the mat input to your image
% or something like this:
% for j=1:4
% img(:,:,j) = cat(3,template{j},template2{j});
% end
% process image
end
другой альтернативой будет создание «изображения» в вашем «matreader», которое не только имеет 2 полосы, но и просто помещает все полосы (все шаблоны) друг над другом, предоставляя «куб данных», а затем на втором шаге после перебора всех небольших файлов матов и чтения их, разделяя отдельные изображения из одного большего куба данных.
будет выглядеть примерно так:
function data=matreader(filename)
load(filename);
for in=1:4
data=cat(3,template{in},template2{in});
end
end
, и в вашем главном файле вы должны просто разделить data
на 4 части.
Я никогда не проверял это, но, возможно, можно вернуть ячейку вместо матрицы?
function data=matreader(filename)
load(filename);
data = cell(1,4)
for in=1:4
data{in}=cat(3,template{in},template2{in});
end
end
Не уверен, что это сработает.
Однако правильный путь отсюда зависит от того, как вы планируете использовать изображения с imds
и действительно ли необходимо использовать imageDatastore
.