0

for ループで画像のバッチ (約 30000) を処理する必要があります。このために、ループを実行するたびに 1 つの画像を読み取ります。

特定の指数 (正確な値はさまざまですが、通常は 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 に答える