2010-03-23 107 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

相關問題