在matlab中读取多个.JPG文件的最有效方法是什么?

时间:2014-07-21 21:19:23

标签: matlab file-io performance

我有一个程序试图在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真的不喜欢循环,所以有没有办法在没有循环的情况下做到这一点?比如':'符号

2 个答案:

答案 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数组(而不是单元格数组)的问题是:

  • 内存需要连续:如果分配的内存足够大,只有6个图像,当你尝试加载第7个时,Matlab将不得不在内存中保留更大的空间,然后复制已经在内存中的6个图像到这个新的(更大的)内存空间之前,它可以继续加载第7个。在您完成加载30张图像之前,这可能会发生几次。然而,单元阵列没有这个问题,因为每个图像都有自己独立分配的内存。
  • 某些JPEG可能比其他JPEG小,但3D数组仅在所有JPEG具有相同形状时才起作用(现在可能不是这种情况,但看起来您希望程序适用于任何JPEG)。 / LI>

答案 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并从那里运行代码以查看潜在的瓶颈。确保将命令拆分为多行,因为每行报告评估性能。