平均值的字节数

时间:2014-01-21 19:11:18

标签: java image bytearray average

我有这样的问题。我想让#34;平均"来自少数不同的图像。我的想法是按顺序将它们加载到BufferImage,在每个位中加总值,而不是仅除以照片数。问题是我不能用数字来划分byte [] []。我做错了什么,或者做到这一点的正确方法是什么?

File[] others = getOtherImageFiles(file);
byte[][] pixels = new byte[300][];
List<byte[][]> pixelsList = new ArrayList<byte[][]>();
for (int i = 0; i < others.length; i++) {
  try {
    img = ImageIO.read(others[i]);
  } catch (IOException e) {
  }
  for (int x = 0; x < img.getWidth(); x++) {
    pixels[x] = new byte[img.getHeight()];
    for (int y = 0; y < img.getHeight(); y++) {
      pixels[x][y] = (byte) (img.getRGB(x, y));
    }
  }
  pixelsList.add(pixels);
}
byte[][] pixelsSum = new byte[300][];
for (int i = 0; i < pixelsList.size(); i++) {
  for (int x = 0; x < img.getWidth(); x++) {
    for (int y = 0; y < img.getHeight(); y++) {
      pixelsSum[x][y] += pixelsList.get(i)[x][y];
    }
  }
}
for (int x = 0; x < img.getWidth(); x++) {
  for (int y = 0; y < img.getHeight(); y++) {
    pixelsSum[x][y]/10;
  }
}
}

我想将它们用作面部比较器,重点是创建一个面部方案。

2 个答案:

答案 0 :(得分:1)

你很亲密。您将除法除以10,但是您从未将结果写回pixelsSum数组,因此结果丢失了。你需要这样做:

pixelsSum[x][y] = pixelsSum[x][y] / 10;

或简写:

pixelsSum[x][y] /= 10;

您将遇到的另一个问题是Java(或任何其他语言)中的每个byte只能保存0到255之间的值。因此,如果您有一个字节x = 255, y = 1,{{1}将结果为0.当你添加10个图像时,它几乎肯定会超过255限制。我建议将pixelsSum从x + y更改为byte[][],然后在进行除法后将其重新设置为字节。

答案 1 :(得分:0)

而不是这组循环:

for (int i = 0; i < pixelsList.size(); i++) {
  for (int x = 0; x < img.getWidth(); x++) {
    for (int y = 0; y < img.getHeight(); y++) {
      pixelsSum[x][y] += pixelsList.get(i)[x][y];
    }
  }
}

你应该把pixelsList引用放在中间:

for (int x = 0; x < img.getWidth(); x++) {
  for (int y = 0; y < img.getHeight(); y++) {
    for (int i = 0; i < pixelsList.size(); i++) {
      pixelsSum[x][y] += pixelsList.get(i)[x][y];
    }
    pixelsSum[x][y] /= pixelsList.size();
  }
}

这应该立即计算平均值,而不是再次循环遍历pixelsSum数组。还要注意/=运算符的使用,它与/运算符相比,执行除法和赋值运算,仅限于数字上下文中的除法。