我有一个图像,我正在提取一个子图像,以提供给我的神经网络。我试图计算同一邻域中所有子图像的平均输出。
因此,如果我有原始图像(m X n像素)并且我在(sub_x,sub_y)找到了尺寸(sub_width和sub_height)的子图像,我还需要提取相同大小的子图像(sub_width和sub_height) at(sub_x + m,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,width和height是我找到的原始子图像的所有整数。
img是原始的全尺寸BufferedImage。
我对表现不太满意。有更快/更聪明的方法吗?
答案 0 :(得分: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
}
}
您也可以尝试切换循环的顺序。与内存排序匹配的顺序应该快得多。