0

我必须在 for 循环中处理一批图像(大约 30000 个)。为此,我在每次执行循环时读取一张图像。

当达到某个指标时(确切值会有所不同,但通常在 2000 左右),进度会显着放缓(因素 2 或 3)。怎么会这样?

这是一个显示此行为的最小代码示例:

imgFolder = [uigetdir, '/'];
files = dir(fullfile(imgFolder, '*.tiff'));
filenames = sort_nat({files.name});

imshow(imread([imgFolder, '/', filenames{1}]))
roi = roipoly;

meansRGB = zeros(3,length(files));
tic;

for i = 1:size(files,1)
    img = imread([imgFolder, '/', filenames{i}]);
    % for j=1:3
       % a = regionprops(roi,img(:,:,j),'PixelValues');
       % meansRGB(j,i) = mean(a.PixelValues);
    % end

    % show remaining time
    dt = 500; % display remaining time every dt'th step
    if(mod(i,dt)) == 0
        disp(i)
        elapsed = toc;
        remainingSeconds = elapsed*(length(files)-i)/dt;
        [hours, minutes, seconds] = sec2hms(remainingSeconds);
        str = sprintf('remaining time: %d:%d:%d', hours, minutes, round(seconds));
        disp(str);
        tic;
    end
end

请注意,我认为会消耗最多时间的所有重要部分都已被注释掉,并且不是减速循环的原因。还有大量的 RAM 和处理器周期,这不应该是问题。

4

2 回答 2

1

交换?

前几百张图片会填满你的 RAM 吗?

任何其他对内存的访问都会触发交换和写入硬盘驱动器,这很容易慢几个数量级......

于 2012-08-09T12:30:54.293 回答
0

是否有可能imread()使文件句柄保持打开状态?(虽然如果是这样的话我会很惊讶?)

您也许可以尝试fclose('all')在循环中进行检查?

于 2012-08-09T22:36:26.970 回答