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]平方尺寸,上述命令的输出大小应确认为正确用于您的目的。patchSize-1patchSize-1

编辑:对于 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 回答