0

我正在尝试创建图像的(平均)灰度,但我似乎没有得到每个像素的值。我想我在总结平均值时没有做正确的计算,但我找不到哪里出了问题。

public byte[] changePixelValues(byte blue, byte green, byte red) {
            //Convert to greyscale by average
            byte avg;
            int sum = 0;
            sum +=blue;
            sum += green;
            sum += red;
            avg = (byte) (sum / 3);

            //System.out.println("avg: " +  avg);
            byte[] values = new byte[3];

            values[0] = avg;
            values[1] = avg;
            values[2] = avg;

            return values;

我在类型转换中遗漏了什么吗?

编辑:

输入如下,其中 byte[] 数据是来自 BufferedImage 的原始数据,在这种情况下它没有 alphaRaster。

for (int i = 0; i < data.length; i += 3) {
      byte [] newData = changer.changePixelValues(data[i], data[i+1], data[i+2]);
      System.arraycopy(newData,0,data,i,3);
}
4

1 回答 1

1

首先,如果你想将图像转换为灰度,你的方法应该只返回一个字节值而不是字节数组。如果您返回一个字节,您可以将该值分配给每个 RGB 通道并获得灰度图像或将该值设置为 8 位图像。

你需要记住java中的字节是有符号的(范围-128到127)所以如果你有例如R通道值等于200(通道值可能在0到255范围内)并且你将它转换为字节,值是等于-56。所以如果你计算平均值(假设 G=B=100)你的平均值等于 48(应该是 133)。

于 2015-07-25T11:05:03.457 回答