4

画像パッチを抽出したい大量の画像があります。パッチはサイズが均一で、各イメージから規則的なグリッド ポイントで抽出されます。次のコードでこれを行うことができます:

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 で画像パッチを抽出する別の方法はありますか?

4

2 に答える 2

5

添え字のインデックス付けは、MATLAB での自然な操作です。

patch = I(y:y+patchSize-1, x:x+patchSize-1);

直観に反しimcropて質問でxのrect = [x y patchSize-1 patchSize-1]2乗次元を指定すると、上記のコマンドの出力サイズが目的に合っていることを確認する必要があります。patchSize-1patchSize-1

EDIT : RGB (または任意の平面マルチチャンネル形式) の場合:

patch = I(y:y+patchSize-1, x:x+patchSize-1, :);
于 2013-09-30T03:09:25.447 に答える
1

パッチが画像の境界から出ないようにしたい場合があります。

patch = I(max(1,y):min(y+patchSize-1,size(I,1)), max(1,x):min(x+patchSize-1,size(I,2)), :);
于 2015-06-02T13:45:28.893 に答える