4

から返された RGBint 値をグレースケール値に変換する簡単な方法を知っている人はい<BufferedImage> getRGB(i,j)ますか?

これを使用してRGB値を分割することにより、RGB値を単純に平均化するつもりでした。

int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;

そして平均的な赤、緑、青。

しかし、私はそのような単純な操作のために何かが欠けているに違いないと感じています...

別の質問に対する素晴らしい回答の後、私は自分が何を望んでいるのかを明確にする必要があります。

getRGB(i,j) から返された RGB 値を取得し、それをそのピクセルの「暗さ」を表す 0 ~ 255 の範囲の白値に変換したいと考えています。

これは平均化などによって達成できますが、数行を節約するための OTS 実装を探しています。

4

3 に答える 3

8

このチュートリアルでは、それを行う 3 つの方法を示します。

変えることでColorSpace

ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
BufferedImage image = op.filter(bufferedImage, null);

グレースケールで描くことでBufferedImage

BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_BYTE_GRAY);
Graphics g = image.getGraphics();
g.drawImage(colorImage, 0, 0, null);
g.dispose();

使用することでGrayFilter

ImageFilter filter = new GrayFilter(true, 50);
ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter);
Image image = this.createImage(producer);
于 2010-03-23T12:20:54.610 に答える
3

色をグレースケールにマッピングする方法について 100% 正しい答えはないため、これは思ったほど単純ではありません。

私が使用する方法は、RGB を HSL に変換し、次に S 部分を 0 にする (オプションで RGB に戻す) ことですが、これはまさにあなたが望むものではないかもしれません。(これは RGB 値の最高値と最低値の平均に相当するため、3 つすべての平均とは少し異なります)

于 2010-03-23T12:50:47.643 に答える
0

Matlab rgb2gray は加重和を使用しますが、平均化は良さそうです。

Matlab rgb2gray をチェック

更新
JavaでMatlabメソッドを実装しようとしましたが、おそらく間違っていましたが、平均化によりより良い結果が得られました。

于 2010-03-23T11:54:01.137 に答える