我有一个程序试图在matlab中读取大约30个.jpg图像(能够远远超过它),我想知道读取文件的最有效方法是什么?
这是我目前的代码:
for i = 1:num_images
image_arr(i,:,:) = rgb2gray(imread(strcat(fin_path, '\' , image_locations(i).name)));
%Reads in i'th .jpg image, converts it to grayscale,
% then moves that into the i'th member of image_array
end
但这需要花费大量时间来执行。有什么建议可以加快速度吗?
具体来说,我知道MATLAB真的不喜欢循环,所以有没有办法在没有循环的情况下做到这一点?比如':'符号
答案 0 :(得分:2)
我会尝试使用一个单元格数组,每个元素都是一个图像(一个二维矩阵)。
images{num_images} = []; % alocate memory for the cell array header
for i = 1:num_images
images{i} = rgb2gray(imread(strcat(fin_path, '\' , image_locations(i).name)));
% Reads in i'th .jpg image, converts it to grayscale,
end
我期望使用3D数组(而不是单元格数组)的问题是:
答案 1 :(得分:2)
最有效的方式当然总是取决于具体情况。可用的资源,数据集的大小,所有相同大小的图像等等。您对使用相机的评论表明所有图像都具有相同的大小。为了测试某些方法的性能,我使用tic toc为四种情况定时性能。为了测试的目的,我使用了44个jpeg图像(1080x1920),名称1.jpg到44.jpg。
情况1 。你的情况,使用没有内存预分配的数组:
经过的时间是5.466675秒。
clear all
num_images=44;
tic
for ii = 1:num_images
filename = strcat(num2str(ii),'.jpg');
temp_img = imread(filename);
image_arr(ii,:,:) = rgb2gray(temp_img);
clear temp_img;
%Reads in i'th .jpg image, converts it to grayscale,
% then moves that into the i'th member of image_array
end
toc
情境2 seb描述的情况,使用具有内存预分配的单元格:
经过的时间是2.388686秒。
clear all
num_images=44;
tic
images{num_images} = []; % alocate memory for the cell array header
for ii = 1:num_images
images{ii} = rgb2gray(imread(strcat(num2str(ii),'.jpg')));
% Reads in i'th .jpg image, converts it to grayscale,
end
toc
情境3 由于所有图片都具有相同的尺寸,因此创建一个大小为[num_images,1080,1920]的数组,内存预分配应有助于提高性能。
经过的时间是3.617463秒。
clear all
num_images=44;
tic
images = zeros(num_images,1080,1920); % pre-alocate memory for array
for ii = 1:num_images
images(ii,:,:) = rgb2gray(imread(strcat(num2str(ii),'.jpg')));
% Reads in i'th .jpg image, converts it to grayscale,
end
toc
情境4 与情况3相同,但现在预分配空间略有不同:[1080,1920,num_images]。
经过的时间是2.826266秒。
clear all
num_images=44;
tic
images = zeros(num_images,1080,1920); % pre-alocate memory for array
for ii = 1:num_images
images(ii,:,:) = rgb2gray(imread(strcat(num2str(ii),'.jpg')));
% Reads in i'th .jpg image, converts it to grayscale,
end
toc
<强>结论强>
结论是在处理完整的高清图像时单元格是最快的,同时应该注意的是,在预分配空间时,迭代器应该被用作第三个索引而不是第一个。
注意强>
我想知道代码的性能使用命令profile viewer
并从那里运行代码以查看潜在的瓶颈。确保将命令拆分为多行,因为每行报告评估性能。