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

まず、画像をグレースケールに変換する場合、メソッドはバイト配列ではなく 1 バイト値のみを返す必要があります。1 バイトを返すと、その値を各 RGB チャネルに割り当てることができ、グレースケール イメージを取得するか、その値を 8 ビット イメージに設定できます。

Java のバイトは符号付き (-128 から 127 の範囲) であることを覚えておく必要があるため、たとえば R チャネルの値が 200 (チャネルの値は 0 から 255 の範囲) の場合、それをバイトにキャストすると、値は次のようになります。 -56 に等しい。したがって、平均を計算すると (G=B=100 と仮定します)、平均は 48 になります (133 のはずです)。

于 2015-07-25T11:05:03.457 に答える