有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用BuffereImage从Java中的RGB颜色空间获取灰度像素值的图像处理

有人知道一种将<BufferedImage> getRGB(i,j)返回的RGBint值转换为灰度值的简单方法吗

我将简单地通过使用这个函数来平均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实现,以节省我几行


共 (3) 个答案

  1. # 1 楼答案

    这个tutorial展示了三种方法:

    通过改变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);
    
  2. # 2 楼答案

    虽然Matlab rgb2gray使用加权和,但平均值听起来不错

    勾选Matlab rgb2gray

    更新
    我试着用Java实现Matlab方法,也许我做得不对,但平均结果更好

  3. # 3 楼答案

    这并不像听起来那么简单,因为is no 100% correct answer for how to map a colour to greyscale.

    我使用的方法是将RGB转换为HSL,然后将S部分设置为0(并可选地转换回RGB),但这可能不是您想要的。(它相当于最高和最低rgb值的平均值,因此与所有3个值的平均值略有不同)