2010-03-23 106 views
4

任何人都知道,从<BufferedImage> getRGB(i,j)返回RGBint值转换成灰度值的简单方法吗?从RGB色彩空间在Java中获得灰度像素值使用的BufferedImage

我要简单地打破起来使用此平均值的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

因为它的声音,因为有is no 100% correct answer for how to map a colour to greyscale.

我会使用的方法是将RGB转换为HSL然后0在S部分(以及任选地转化回RGB),但是这可能不是确切地,这不是简单你想要什么。 (这相当于平均最高和最低RGB值这么的所有3个平均有点不同的)

+0

谢谢,我结束了去为HSV如链接到你的答案 – Bolster 2010-03-23 20:20:16

0

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

检查Matlab rgb2gray

UPDATE
我试图用Java实现Matlab的方法,也许我没有错,但平均得到更好的结果。

+0

我尝试同样@medopal!伟大的思想和这样... – Bolster 2010-03-23 12:39:32

8

tutorial显示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); 
+0

感谢@polygenelubricants但我真的只是寻找一个单个像素的灰度等效值(但有书签链接的教程:)) – Bolster 2010-03-23 12:34:14

相关问题