を使用して、単純なカラーからグレースケールへの変換を行いたいと考えていますjava.awt.image.BufferedImage
。画像処理初心者ですので、見当違いでしたらご容赦ください。
私の入力画像は RGB 24 ビット画像 (アルファなし) です。出力で 8 ビット グレースケールを取得したいのですがBufferedImage
、これは次のようなクラスを持っていることを意味します (明確にするために詳細は省略されています)。
public class GrayscaleFilter {
private BufferedImage colorFrame;
private BufferedImage grayFrame =
new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
私は今まで2つの変換方法をうまく試してきました。最初は次のとおりです。
private BufferedImageOp grayscaleConv =
new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
protected void filter() {
grayscaleConv.filter(colorFrame, grayFrame);
}
そして2番目は:
protected void filter() {
WritableRaster raster = grayFrame.getRaster();
for(int x = 0; x < raster.getWidth(); x++) {
for(int y = 0; y < raster.getHeight(); y++){
int argb = colorFrame.getRGB(x,y);
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = (argb ) & 0xff;
int l = (int) (.299 * r + .587 * g + .114 * b);
raster.setSample(x, y, 0, l);
}
}
}
最初の方法ははるかに高速に動作しますが、生成される画像は非常に暗いため、許容できない帯域幅を失っています (グレースケールと sRGB の間で使用される tosRGB8LUT と呼ばれる色変換マッピングがいくつかありColorModel
ますが、私にとってはうまく機能しません)。わかりますが、よくわかりません。それらの値が使用されていると思います)。2 番目の方法は動作が遅くなりますが、効果は非常に優れています。
これら2つを組み合わせる方法はありますか?カスタム インデックスColorSpace
を使用してColorConvertOp
? はいの場合、例を教えてください。
前もって感謝します。