Среднее значение байта
Я пытаюсь создать (среднюю) шкалу серого изображения, и я не получаю значения для каждого пикселя. Я думаю, что я не делаю правильные вычисления при суммировании среднего значения, но я не могу найти, что не так.
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);
}
1 ответ
Прежде всего, если вы хотите преобразовать изображение в оттенки серого, вы должны вернуть только одно байтовое значение, а не байтовый массив. Если вы вернете один байт, вы можете назначить это значение каждому каналу RGB и получить изображение в градациях серого или установить это значение на 8-битное изображение.
Вы должны помнить, что байт в java подписан (диапазон от -128 до 127), поэтому, если у вас, например, значение R-канала равно 200 (значения канала могут быть в диапазоне от 0 до 255), и вы приведете его к байту, значение будет равно -56. Таким образом, если вы рассчитываете среднее значение (допустим, что G=B=100), у вас есть среднее значение, равное 48 (должно быть 133).