我有一大組圖像,我希望從中提取圖像補丁。這些補丁的大小一致,並在規則網格點從每幅圖像中提取。我可以用下面的代碼做到這一點:Matlab:高效圖像補丁提取
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中提取圖像補丁而不會產生如此巨大的處理開銷?
確保你從'y + patchSize'和'x + patchSize'中減1。但是,這是要走的路。我已經做了大量的圖像處理,而且我之前從未使用'imcrop' ... – Justin
@jucestain:感謝您的更正。如果'patchSize'被解釋爲方塊的尺寸,這當然是正確的,但是這個結果與'imcrop'例子的尺寸不同,因爲'rect(3:4)'是寬度和高度。我想這只是OP代碼中的一個錯誤。 – chappjc
太好了,謝謝。我認爲imcrop會執行此索引,並且沒有性能差異。每個圖像現在需要約1秒,而不是約2秒,使用imcrop版本(使用100x100的16x16像素補丁網格,每個圖像3個縮放比例 - 1,0.5,0.25)。 – Josh