2014-12-05 62 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