我有这样的问题。我想让#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;
}
}
}
我想将它们用作面部比较器,重点是创建一个面部方案。
答案 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
数组。还要注意/=
运算符的使用,它与/
运算符相比,执行除法和赋值运算,仅限于数字上下文中的除法。