2013-09-30 96 views
4

我有一大組圖像,我希望從中提取圖像補丁。這些補丁的大小一致,並在規則網格點從每幅圖像中提取。我可以用下面的代碼做到這一點: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中提取圖像補丁而不會產生如此巨大的處理開銷?

回答

5

下標索引是MATLAB中的一項自然操作。

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

鑑於問題的違反直覺的使用imcroprect = [x y patchSize-1 patchSize-1]給人patchSize-1 X patchSize-1上述命令的輸出尺寸的正方形尺寸應被確認爲正確的爲您的目的。

編輯:對於RGB(或任何平面多聲道格式):

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

確保你從'y + patchSize'和'x + patchSize'中減1。但是,這是要走的路。我已經做了大量的圖像處理,而且我之前從未使用'imcrop' ... – Justin

+0

@jucestain:感謝您的更正。如果'patchSize'被解釋爲方塊的尺寸,這當然是正確的,但是這個結果與'imcrop'例子的尺寸不同,因爲'rect(3:4)'是寬度和高度。我想這只是OP代碼中的一個錯誤。 – chappjc

+1

太好了,謝謝。我認爲imcrop會執行此索引,並且沒有性能差異。每個圖像現在需要約1秒,而不是約2秒,使用imcrop版本(使用100x100的16x16像素補丁網格,每個圖像3個縮放比例 - 1,0.5,0.25)。 – Josh

1

您可能希望確保這個補丁將永不熄滅的圖像邊界的:

patch = I(max(1,y):min(y+patchSize-1,size(I,1)), max(1,x):min(x+patchSize-1,size(I,2)), :);