Среднее значение байта

Я пытаюсь создать (среднюю) шкалу серого изображения, и я не получаю значения для каждого пикселя. Я думаю, что я не делаю правильные вычисления при суммировании среднего значения, но я не могу найти, что не так.

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).

Другие вопросы по тегам