字节值的平均值
Average of byte values
我正在尝试创建图像的(平均)灰度,但我似乎没有获得每个像素的值。我想我在总结平均值时没有做正确的计算,但我找不到错误的地方。
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);
}
首先,如果你想将图像转换为灰度,你的方法应该return只有一个字节值而不是字节数组。如果您 return 一个字节,您可以将该值分配给每个 RGB 通道,并获得灰度图像或将该值设置为 8 位图像。
您需要记住 java 中的字节是有符号的(范围为 -128 到 127),因此如果您的 R 通道值等于 200(通道值可以在 0 到 255 范围内)并将其转换为字节,值等于 -56。因此,如果您计算平均值(假设 G=B=100),则平均值等于 48(应为 133)。
我正在尝试创建图像的(平均)灰度,但我似乎没有获得每个像素的值。我想我在总结平均值时没有做正确的计算,但我找不到错误的地方。
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);
}
首先,如果你想将图像转换为灰度,你的方法应该return只有一个字节值而不是字节数组。如果您 return 一个字节,您可以将该值分配给每个 RGB 通道,并获得灰度图像或将该值设置为 8 位图像。
您需要记住 java 中的字节是有符号的(范围为 -128 到 127),因此如果您的 R 通道值等于 200(通道值可以在 0 到 255 范围内)并将其转换为字节,值等于 -56。因此,如果您计算平均值(假设 G=B=100),则平均值等于 48(应为 133)。