画像パッチを抽出したい大量の画像があります。パッチはサイズが均一で、各イメージから規則的なグリッド ポイントで抽出されます。次のコードでこれを行うことができます:
for n = 1:nImages
% Read image
imageFile = imageFiles{n};
I = imread(imageFile);
% Grid point locations
height = size(I, 1);
width = size(I, 2);
border = floor(patchSize/2);
centres = gridPoints(height, width, nPointsX, nPointsY, border);
% Extract and process patches
for p = 1:nPatches
% Patch location
x = centres(p, 1);
y = centres(p, 2);
% Top-left point of patch
x = x - floor(patchSize/2) + 1;
y = y - floor(patchSize/2) + 1;
% Extract patch -- BOTTLENECK!
patch = imcrop(I, [x y patchSize-1 patchSize-1]);
% Process patch
% ...
end
end
このコードは、特に多数の画像と多数のグリッド ポイントの両方を考えると、非常に非効率的です (画像ごとに異なる縮尺でこれを行っています)。Matlab のプロファイラーを実行したところ、imcrop がこの非効率性の原因であることがわかりました。わずか 50 枚の画像 (ただし、3 つの縮尺で 100 x 100 のグリッド ポイント) で実行すると、756 秒かかりました。
このような巨大な処理オーバーヘッドを発生させることなく、Matlab で画像パッチを抽出する別の方法はありますか?