我有多个小型* .mat文件,每个文件包含4个输入图像(template{1:4}
和第二个通道template2{1:4}
)和4个输出图像(region_of_interests{1:4}
),并进行了二值化处理('mask ')图像来训练深度神经网络。
我基本上遵循了Mathworks和it suggests to use a function(在此示例为@matreader
)中的示例,以自定义文件格式进行读取。
但是...
pixelLabelDatastore
。作为一种解决方法,我最终将* .mat文件的内容保存到图像(使用imwrite
,保存到save_dir
),然后从那里重新加载(在这种情况下,该功能不会甚至不允许加载* .mat文件。)。 (如何)无需重新将文件另存为图像就可以实现?这是我失败的尝试:
%main script
image_dir = pwd; %location of *.mat files
save_dir = [pwd '/a/']; %location of saved output masks
imds = imageDatastore(image_dir,'FileExtensions','.mat','ReadFcn',@matreader); %load template (input) images
pxds = pixelLabelDatastore(save_dir,{'nothing','something'},[0 255]);%load region_of_interests (output) image
%etc, etc, go on to train network
%matreader function, save as separate file
function data=matreader(filename)
in=1; %give up the 3 other images stored in template{1:4}
load(filename); %loads template and template2, containing 4x input images each
data=cat(3,template{in},template2{in}); %concatinate 2 template input images in 3rd dimension
end
%generate example data for this question, will save into a file 'example.mat' in workspace
for ind=1:4
template{ind}=rand([200,400]);
template2{ind}=rand([200,400]);
region_of_interests{ind}=rand([200,400])>.5;
end
save('example','template','template2','output')
答案 0 :(得分:2)
您应该能够使用标准的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个波段,而且只需将所有波段(所有模板)相互叠加即可提供“数据立方体”,然后在第二个遍历所有较小的mat文件并读取它们之后,将步骤从一个较大的datacube中拆分出来。
看起来像这样:
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
。