我有一大堆图像,我希望从中提取图像补丁。贴片尺寸均匀,并在常规网格点从每个图像中提取。我可以使用以下代码执行此操作:
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中提取图像补丁而不会产生如此巨大的处理开销?
答案 0 :(得分:5)
下标索引是MATLAB中的一个自然操作。
patch = I(y:y+patchSize-1, x:x+patchSize-1);
鉴于imcrop
在rect = [x y patchSize-1 patchSize-1]
给出方括号patchSize-1
x patchSize-1
的问题中违反直觉,上述命令的输出大小应确认为正确为了你的目的。
编辑:对于RGB(或任何平面多通道格式):
patch = I(y:y+patchSize-1, x:x+patchSize-1, :);
答案 1 :(得分:1)
您可能希望确保补丁永远不会超出图像边界:
patch = I(max(1,y):min(y+patchSize-1,size(I,1)), max(1,x):min(x+patchSize-1,size(I,2)), :);