2014-12-05 77 views
2

我有一個圖像,我正在提取一個子圖像以供給我的神經網絡。我試圖計算同一鄰域中所有子圖像的平均輸出。所以如果我有一個原始圖像(m×n像素),並且在大小(sub_width和sub_height)處發現了一個子圖像(sub_x,sub_y),我還需要提取相同大小的子圖像(sub_width和sub_height )在(sub_x +米,sub_y + n),其中m和n爲1去 - 3.查找相鄰子圖像的算法

我已經有一個工作溶液:

for (int subX = (x-3); subX < (x+4); subX++) 
    for (int subY = (y-3); subY < (y+4); subY++) 
     if ((subX > 0) && (subY > 0)) 
     if (((subX + width) < img.getWidth()) && ((subY + height) < img.getHeight())){ 
      counter++; 
      testingImage = img.getSubimage(subX, subY, width, height);  
     } 

的x,y,寬度和高度均爲整數我發現的原始子圖像。

img是原始的全尺寸BufferedImage。

雖然我對錶演不太滿意。有沒有更快/更聰明的方法來做到這一點?

+0

'img.getSubimage'花費了多少時間?如果很多,也許你可以用你自己的專門功能替換它。 – mik01aj 2014-12-05 21:25:08

+0

我沒有時間說實話。但是,我不認爲這個問題與getSubimage方法有關。性能非常好,直到我添加了這個代碼塊。我大大增加了所需的計算。這只是應用程序的一小部分,但我有N個元素需要通過這個代碼塊。以前我只有一個subImage,所以沒問題。 – wFateem 2014-12-05 22:17:06

回答

1

下面是你可以做的一件簡單的事情:擺脫循環內的條件。首先計算您的範圍,然後運行循環,而不進行範圍檢查。

int subXStart = max(x-3, 0); 
int subYStart = max(y-3, 0); 
int subXEnd = min(x+4, img.getWidth() - width); 
int subYEnd = min(y+4, img.getHeight() - height); 
for (int subX = subXStart; subX < subXEnd; subX++) { 
    for (int subY = subYStart; subY < subYEnd; subY++) { 
     counter++; 
     testingImage = img.getSubimage(subX, subY, width, height); 
     // run your neural net 
    } 
} 

您也可以嘗試切換循環順序。匹配內存順序的順序應該快得多。

+0

這絕對是一個更聰明的方式來處理我有的醜陋的if語句。謝謝! 性能沒有顯着提高,但我想這種計算成本真的沒有辦法。 – wFateem 2014-12-05 22:32:36