使用BufferedImage从Java中获取RGB colourspace的灰度像素值

有人知道将从 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实现来节省几行。

这并不像听起来那么简单,因为对于如何将颜色映射到灰度,没有100%正确的答案。

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

本教程介绍了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); 

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

检查Matlab rgb2gray

UPDATE
我尝试在Java中实现Matlab方法,也许我做错了,但平均值给出了更好的结果。