java.awt.image.BufferedImage 使用自定义 ColorSpace 将 24 位 RGB 转换为 8 位灰度

标签 java image image-processing awt jai

我想使用 java.awt.image.BufferedImage 进行简单的颜色到灰度的转换。我是图像处理领域的初学者,所以如果我有什么困惑,请原谅。

我的输入图像是一个 RGB 24 位图像(无 alpha),我想在输出上获得一个 8 位灰度 BufferedImage,这意味着我有一个这样的类(为清楚起见,省略了详细信息):

public class GrayscaleFilter {
    private BufferedImage colorFrame;
    private BufferedImage grayFrame = 
        new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);

到目前为止,我已经成功尝试了两种转换方法,第一种是:

    private BufferedImageOp grayscaleConv = 
        new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);

    protected void filter() {
        grayscaleConv.filter(colorFrame, grayFrame);
    }

第二个是:

    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);
            }
        }
    }

第一种方法工作得更快,但生成的图像非常暗,这意味着我正在失去带宽,这是 Not Acceptable (在灰度和 sRGB ColorModel 之间使用了一些称为 tosRGB8LUT 的颜色转换映射据我所知,对我来说效果不佳,但我不确定,我只是假设使用了这些值)。第二种方法比较慢,但是效果很好。

是否有结合这两者的方法,例如。为 ColorConvertOp 使用自定义索引的 ColorSpace?如果是,能否请您举个例子?

提前致谢。

最佳答案

public BufferedImage getGrayScale(BufferedImage inputImage){
    BufferedImage img = new BufferedImage(inputImage.getWidth(), inputImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
    Graphics g = img.getGraphics();
    g.drawImage(inputImage, 0, 0, null);
    g.dispose();
    return img;
}

关于java.awt.image.BufferedImage 使用自定义 ColorSpace 将 24 位 RGB 转换为 8 位灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3922172/

相关文章:

java - android-arm/libjnidispatch.so 找不到错误

java - 单机环境下如何实例化Spring boot Repository?

html - 使用 Markdown 调整jupyter笔记本中的图像大小

c++ - 使用 OpenCV 通过直方图查找 HSV 阈值

java - 将多个 vector 添加到 vector 的 vector 中不起作用,Java

java - 在 RecyclerView 中显示 Firestore 集合的问题

javascript - 快速加载 HTML 中的图像

python - 如何在 python 中更改图像捕获日期?

matlab - 形状识别——数芒果

python - 如何计算numpy数组中图像的平均颜色?