如何在Matlab中更快地读取一堆TIFF文件?

时间:2018-02-08 06:59:14

标签: matlab tiff imread

我必须阅读数百个TIFF文件,执行一些数学运算,并输出一些内容。这是针对数千个实例进行的。最大的瓶颈是难以理解的。使用PixelRegion,我只读取文件的一部分,但它仍然很慢。

目前,阅读部分在这里。

你能建议我如何加快速度吗?

for m = 1:length(pfile)
    if ~exist(pfile{m}, 'file')
        continue;
    end
    pConus = imread(pfile{m}, 'PixelRegion',{[min(r1),max(r1)],[min(c1),max(c1)]});
    pEvent(:,m) = pConus(tselect);
end

1 个答案:

答案 0 :(得分:2)

一般加速

  • 每次迭代时像素区域似乎没有变化。我不完全确定Matlab是否会优化最小和最大呼叫(尽管我很确定它不会)。如果在每次迭代时都不更改它们,请将它们移出for循环并计算一次。

PARFOR

以下解决方案假设您可以访问并行计算工具箱。我用10,840个tiff测试了它,每个图像最初是1000x1000,但我只读了300x300的部分。我不确定有多少大pConus(tselect),所以我只存储了整个300x300图像。

P.S。抱歉格式化。它拒绝将其格式化为代码块。

结果基于我的2.3 GHz i7 w / 16GB ram

  • for:130s
  • parfor:26s +开始游泳池的时间

%安装

clear;clc;
n = 12000;

% Would be faster to preallocate this, but negligeble compared to the
% time it takes imread to complete.
fileNames = {};

for i = 1:n
    name = sprintf('in_%i.tiff', i);
    % I do the exist check here, assuming that the file won't be touched in
    % until the program advances a files lines.
    if exist(name, 'file')
        fileNames{end+1} = name;
    end 
end
rows = [200, 499];
cols = [200, 499];
pics = cell(1, length(fileNames));

tic;
parfor i = 1:length(fileNames)
    % I don't know why using the temp variable is faster, but it is
    temp = imread(fileNames{i}, 'PixelRegion', {rows, cols});
    pics{i} = temp;
end
toc;