4

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

我打算通过使用它分解它们来简单地平均 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 实现来节省我的几行代码。

4

3 回答 3

8

教程展示了 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);
于 2010-03-23T12:20:54.610 回答
3

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

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

于 2010-03-23T12:50:47.643 回答
0

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

检查Matlab rgb2gray

更新
我尝试在 Java 中实现 Matlab 方法,也许我做错了,但平均得到了更好的结果。

于 2010-03-23T11:54:01.137 回答