Getting Greyscale pixel value from RGB colourspace in Java using BufferedImage

前端 未结 3 1434
抹茶落季
抹茶落季 2021-01-14 03:54

Anyone know of a simple way of converting the RGBint value returned from getRGB(i,j) into a greyscale value?

I was going to simply

相关标签:
3条回答
  • 2021-01-14 04:25

    This tutorial shows 3 ways to do it:

    By changing ColorSpace

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

    By drawing to a grayscale BufferedImage

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

    By using GrayFilter

    ImageFilter filter = new GrayFilter(true, 50);
    ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter);
    Image image = this.createImage(producer);
    
    0 讨论(0)
  • 2021-01-14 04:26

    Averaging sounds good, although Matlab rgb2gray uses weighted sum.

    Check Matlab rgb2gray

    UPDATE
    I tried implementing Matlab method in Java, maybe i did it wrong, but the averaging gave better results.

    0 讨论(0)
  • 2021-01-14 04:42

    this isn't as simple as it sounds because there is no 100% correct answer for how to map a colour to greyscale.

    the method i'd use is to convert RGB to HSL then 0 the S portion (and optionally convert back to RGB) but this might not be exactly what you want. (it is equivalent to the average of the highest and lowest rgb value so a little different to the average of all 3)

    0 讨论(0)
提交回复
热议问题