使用BufferedImage在Java中从RGB颜色空间获取灰度像素值

4

有人知道将从<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范围内的白色值。

虽然可以通过平均值等方式来实现,但我正在寻找一个现成的实现方法以节省几行代码。

3个回答

8
这个教程展示了三种方法来实现这个功能:
通过改变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);

谢谢@polygenelubricants,但我只是在寻找单个像素的等效灰度值(但已经收藏了链接的教程 :)) - Bolster

3

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

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


谢谢,最终我选择了你回答中提供的HSV。 - Bolster

0

平均化听起来不错,尽管Matlab rgb2gray使用加权和。

请查看Matlab rgb2gray

更新
我尝试在Java中实现Matlab方法,也许我做错了,但是平均化效果更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接